实例属性可变性(非常基本)

Instance attribute mutability (very basic)

绑定了两个名称的不可变对象:

xint=1
yint=xint
print yint #>>1
xint=2
print yint #>>1 - did not change as expected since yint refers to an immutable object

绑定了两个名称的可变对象:

xmutable=[1,2,3]
ymutable=xmutable
print ymutable #>>[1,2,3]
xmutable[2]='yo'
print ymutable #>>[1,2,'yo'] - changed since the list object referred to was mutated, as expected

名称绑定到变异的实例属性:

class bob:
    def __init__(self, n):
        self.n=n
        self.i=0

bob1=bob(2)

i = bob1.i
print i #>>0
bob1.i += 1
print i #>>0 - did not change, not what I expected.

以上,如果这是一个非常愚蠢的问题,请原谅我,我认为全局名称 i 是指实例属性 bob1.i(而不是基础整数),它应该是可变的。我希望类似于将名称绑定到列表时,如果列表发生变化(或在这种情况下为实例属性),则绑定到它的所有名称都会反映该更改(如第二个示例)。

int 是不可变的,因此当您使用 bob.i += 1 创建新对象时,我指向 bob.i 的 int 值。如果您使用的是像列表这样的可变项,那么 i 和 bob.i 的值会发生变化,因为它们仍然指向同一个对象:

class bob:
    def __init__(self, n):
        self.n=n
        self.i=[0]

bob1=bob(2)

i = bob1.i
print i #>>0
bob1.i[0] += 1
print(bob1.i)
print i #>> now both are [1]

使用你的代码,如果你打印 id,你会看到我总是指向同一个对象,但 bob.i 指向一个新对象,它是用 bob.i += 1:[=13 创建的=]

class bob:
    def __init__(self, n):
        self.n=n
        self.i=0

bob1=bob(2)

print(id(i))
print(id(bob1.i))
bob1.i += 1
print(id(bob1.i))
print(id(i))
print(id(1))
28426608
28426608
28426584
28426608