为什么python会在每个新赋值中为变量分配新内存?

时间:2014-11-04 16:11:50

标签: python memory-management

为什么重新分配变量时会分配python新内存中的新值?为什么无法进行修改,如果将额外的值附加到列表中,但是当它与当前列表重新分配加上一些新列表时,就会发生新的内存分配。

>>> a=2
>>> id(a)
13332800
>>> a=a+2    # reassigning allocates new memory
>>> id(a)
13332752
>>> a=[1,2,3,4]
>>> id(a)
139923169899008
>>> a.append(2)  # change takes in place
>>> id(a)
139923169899008
>>> a=a+[3,2]    # this way causes new memory allocation
>>> id(a)
139923169899656

有没有办法避免在每次新作业中重新分配内存?

1 个答案:

答案 0 :(得分:2)

Python的设计是整数为immutable objects。意思是,你永远不能改变(改变)它们,并且每个操作都会产生一个新的整数对象:

>>> a = 2
>>> id(a)
505911000
>>> id(a + 1)
505911016
>>> a += 2
>>> id(a)
505911032
>>>

另一方面,列表被设计为mutable objects。这意味着您可以更改/更新其内容而无需创建新的列表对象。而且,这正是list.append方法的作用。它在列表中添加了一个新项而不创建新对象。

此代码:

a=a+[3,2]

list.append不同之处在于 创建新的列表对象,因为您使用了+运算符。 a+[3,2]创建一个新的列表对象,它是a[3,2]的组合。然后,将此新对象分配给名称a,使旧列表对象蒙上阴影,并使a现在引用新列表。这就是id(a)返回不同数字的原因。