我已经使用了很长时间的Python,但我不知道对象和内存是如何工作的。
直到几天前,我认为alpha = gamma
创建了一个名为alpha
的变量,并在其中保存了gamma
的副本,而没有将变量相互链接。但是,我最近注意到这种情况不会发生。两个变量实际上都指向同一个对象。然而,当您更改其中一个数据时,变量会变得独立(取决于变量)。
还有许多其他情况,变量的行为与您的预期不同。这是我遇到的一个例子:
>>> grid1=[[0]*4]*4
>>> grid2=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
>>> grid1 == grid2
True
>>> grid1[2][3]+=1
>>> grid2[2][3]+=1
>>> grid1
[[0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 1]]
>>> grid2
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0]]
我试图找到有关=
和其他命令如何处理变量并找到some threads的更多信息,但我有很多问题我的答案我还不知道:
grid1
表现得像grid2
)?x+=y
vs x = x + y
,append
vs +
)?==
false
is
无效,这两个变量是在不同的步骤中创建的,并且是独立的,所以它们不会处于记忆中的同一个位置)因为在grid1
中所有列表都在内存中的同一位置,而在grid2
中它们是独立的?我无法在任何地方找到这些问题的答案,是否有人可以简单回答问题或提供解释这些问题的参考?感谢。
答案 0 :(得分:0)
grid1=[[[0] for _ in range(4)] for _ in range(4)]
会让它按照您的意愿运作。这是因为它实际上每次创建一个新列表而不是重复它(如[[0]*4]*4
那样)。a = "hi";b = a; b += "!"
时,b将设置为复制a
的新字符串,然后复制到复制b
并添加"!"
的新字符串。 a = [];b = a;b.append(1)
时,b设置为a,然后将1
追加到b
(在内存中引用a
)。 /> ==
评估值的相等性(即,如果它们包含相同的值),而is
评估两者是否是同一个对象。 (尝试在两个相同的列表上测试==
和is
。第一种情况a = [1]; b = [1]
和第二种情况a = [1]; b = a
。