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

时间:2015-01-14 01:19:57

标签: python object instance mutable

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

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

1 个答案:

答案 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