实例属性可变性(非常基本)
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
绑定了两个名称的不可变对象:
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