为什么重新分配变量时会分配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
有没有办法避免在每次新作业中重新分配内存?
答案 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)
返回不同数字的原因。