我有以下代码:
a = 2
b = a
a = a + 2
print (a)
print (b)
我的问题是,为什么b打印为2而不是4?如果将a分配给b,b并不总是引用a的内存吗?
谢谢
答案 0 :(得分:2)
当您重新分配a
时,变量将重新分配到新地址:
>>> a = 2
>>> b = a
# get memory address for a and b
>>> id(a)
4357961072
>>> id(b)
4357961072
# they are the same
# now reassign
>>> a = a + 2
# id of a has changed
>>> id(a)
4357961136
# id of b has not
>>> id(b)
4357961072
答案 1 :(得分:2)
因为您已通过x = x + 1
将x重新分配到了一个新位置,但这与不变性无关。
用于检查:
x = 2
y = x
>>> id(x), id(y)
(26726784, 26726784) # same
然后,更改此:
x = x+1
>>> id(x), id(y)
(26726760, 26726784) # not same, because x reassigned to a new reference location.
如果您对可变的list
进行相同操作,则会得到相同的结果:
x=[5]
y=x
>>> id(x), id(y)
(139890260976056, 139890260976056)
根据作业:
x = x + [5]
>>> id(x), id(y)
(139890260094344, 139890260976056) # not same, id reallocated on assignment
>>> x, y
([5, 5], [5])
您将通过使用x.append(5)
在列表上看到可变的行为,其中x和y在您修改对象本身时都会改变。但是在这种情况下,引起差异的不是对象的可变性。更改参考的是作业x=something else
。
在python中,关于int
的一个有趣特性是,较小的变量已预先分配。例如,如果您这样做:
x = 5
y = x
x = 5
id(x) == id(y) # True
如果您这样做,则ID将相同:
x = 5000000000000
y = x
x = 5000000000000 # same as previous.
id(x) == id(y) # False
这是由于小整数具有预先分配的位置,而大整数则没有。这样,对大整数的重新分配将找到其他位置。
这证实了@ juanpa.arrivillaga的观点,这是由于分配而不是不变性。
答案 2 :(得分:0)
不是所有的python对象都是可变的,这是它们的列表。