如何在Python for循环中操作实际对象而非副本?

12 投票
3 回答
10543 浏览
提问于 2025-04-15 12:12

假设我有一个列表

a = [1,2,3]

我想要在原地把这个列表里的每个项都加一。我想做的事情要像这样简单

for item in a:
    item += 1

但是在这个例子中,Python只使用了item的值,而不是它的实际引用,所以当我完成这个循环后,a 还是返回 [1,2,3],而不是 [2,3,4]。我知道我可以做类似这样的事情

a = map(lambda x:x+1, a)

但这并不太适合我现在的代码,我真的不想重写它 :-\

3 个回答

10

与其使用你那种基于map的方法,不如试试这个基于列表推导式的方法。

a = [item + 1 for item in a]
18

在Python中,整数(还有浮点数、字符串和元组)是不可变的,这意味着你得到的是实际的对象,而不是它的副本,你就是不能直接改变它。

发生的事情是,在这一行:item += 1,你实际上是在创建一个新的整数(它的值是item + 1),然后把名字item指向这个新整数。

你想要做的是改变a[index]所指向的整数,这就是为什么这一行a[index] += 1可以工作的原因。你仍然是在创建一个新的整数,但接着你更新了列表,让它指向这个新整数。

顺便提一下:

for index,item  in enumerate(a):
    a[index] = item + 1

... 这个写法比Triptych给出的答案稍微更符合习惯。

撰写回答