这两个类定义结构相同,除了在奇怪的()类定义中,属性'd'是一个列表,而在normal()类定义中它是一个int.我不明白为什么奇怪的()类导致self.d = d,而类normal()不是这种情况.为什么Python会在这种情况下对int和列表进行不同的处理?
class weird:
def __init__(self):
d = [1,2,3]
self.d = d
for x in range(3):
d[x] = 10+x
print "d =", d
print "self.d =", self.d
class normal:
def __init__(self):
d = 1
self.d = d
d = 11
print "d =", d
print "self.d =", self.d
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我得到了
>>> a=weird()
d = [10, 11, 12]
self.d = [10, 11, 12]
>>> b=normal()
d = 11
self.d = 1
Run Code Online (Sandbox Code Playgroud)
你正在混淆一个对象的变异.
在一种方法中,您为其分配了新值d,更改了指向的内容:
d = 11
Run Code Online (Sandbox Code Playgroud)
但在其他的方法,你改变的值包含在d:
d[x] = 10 + x
Run Code Online (Sandbox Code Playgroud)
注意[x]那里; 从本质上讲,你是告诉python这样做的:
d.__setitem__(x, 10 + x)
Run Code Online (Sandbox Code Playgroud)
d指向列表的变量值永远不会更改.所引用的列表中的值d确实会发生变化.
看看我之前的这个答案,它更详细地说明了这两个语句之间的区别:Python列表并不反映变量.