为什么Python在每次赋值时都为变量分配新内存?

2 投票
1 回答
2521 浏览
提问于 2025-05-01 14:19

为什么在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 个回答

3

Python 设计的时候让整数成为不可变对象。这意味着你不能改变它们,每次对它们进行操作时,都会生成一个新的整数对象:

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

而列表则被设计为可变对象。这意味着你可以在不创建新列表对象的情况下,改变或更新它们的内容。而且,这正是list.append方法的作用。它会在列表中添加一个新项,而不会创建一个新的对象。

不过,下面这段代码:

a=a+[3,2]

list.append不同,因为它会创建一个新的列表对象,这是因为你使用了+运算符。a+[3,2]会生成一个新的列表对象,这个新列表是a[3,2]的组合。然后你把这个新对象赋值给变量a,这样就覆盖了原来的列表对象,使得a现在指向新的列表。这就是为什么id(a)返回一个不同的数字。

撰写回答