python对象的内存分配

时间:2018-11-28 19:42:51

标签: python

我有以下代码:

a = 2
b = a

a = a + 2
print (a)
print (b)

我的问题是,为什么b打印为2而不是4?如果将a分配给b,b并不总是引用a的内存吗?

谢谢

3 个答案:

答案 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对象都是可变的,这是它们的列表。