如何在python for循环中操作实际对象而不是副本?

spe*_*wah 7 python

假设我有一个清单

a = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

我想增加该列表中的每个项目.我想做一些语法上容易的事情

for item in a:
    item += 1
Run Code Online (Sandbox Code Playgroud)

但是在那个示例中,python只使用了值item,而不是它的实际引用,所以当我完成该循环时a仍然返回[1,2,3]而不是[2,3,4].我知道我可以做点什么

a = map(lambda x:x+1, a)
Run Code Online (Sandbox Code Playgroud)

但这并不适合我当前的代码,我不想重写它: - \

Tri*_*ych 21

你走了:

# Your for loop should be rewritten as follows:
for index in xrange(len(a)):
    a[index] += 1
Run Code Online (Sandbox Code Playgroud)

顺便提一下,item是对itemin 的引用a,但是当然你不能为整数赋值.对于任何可变类型,您的代码都可以正常工作:

>>> a = [[1], [2], [3], [4]]
>>> for item in a: item += [1]
>>> a
[[1,1], [2,1], [3,1], [4,1]]
Run Code Online (Sandbox Code Playgroud)


Aar*_*paa 12

在python整数(和浮点数,字符串和元组)是不可变的,所以你有实际的对象(而不是副本),你只是无法改变它.

发生的事情是:在行中:item += 1您正在创建一个新的整数(值为item + 1)并将名称绑定item到它.

你想要做的是改变a[index]指向行的原因的整数a[index] += 1.您仍然在创建一个新的整数,但随后您将更新列表以指向它.

作为旁注:

for index,item  in enumerate(a):
    a[index] = item + 1
Run Code Online (Sandbox Code Playgroud)

...比Triptych发布的答案略微更惯用.


Han*_*Gay 9

map这是一个基于列表理解的解决方案,而不是基于您的解决方案

a = [item + 1 for item in a]
Run Code Online (Sandbox Code Playgroud)