两个名称绑定的不可变对象:
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
(而不是基础整数),它应该是可变的。我希望类似于名称绑定到列表时,如果列表变异(或在这种情况下为实例属性),绑定到它的所有名称都将反映该更改(如第二个示例)。
答案 0 :(得分:0)
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创建的新对象:
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