如何在Python for循环中操作实际对象而非副本?
假设我有一个列表
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给出的答案稍微更符合习惯。
30
给你看看:
# Your for loop should be rewritten as follows:
for index in xrange(len(a)):
a[index] += 1
顺便说一下,item确实是指向中的item
,但当然你不能给一个整数赋新值。对于任何可变类型,你的代码就可以正常工作:
>>> a = [[1], [2], [3], [4]]
>>> for item in a: item += [1]
>>> a
[[1,1], [2,1], [3,1], [4,1]]