为什么Python在Class命名空间中以不同方式处理列表和整数?

0 python namespaces class

这两个类定义结构相同,除了在奇怪的()类定义中,属性'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)

Mar*_*ers 7

你正在混淆一个对象的变异.

在一种方法中,您为其分配了新值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列表并不反映变量.