循环python的迭代

时间:2013-03-17 18:13:41

标签: python for-loop iteration

为什么会这样?

版本1:

mylist= [1,2,3,4,5]
print mylist
for index, value in enumerate(mylist):
    value = 0
print mylist

第2版:

mylist= [[1],[2],[3],[4],[5]]
print mylist
for index, value in enumerate(mylist):
    value[0] = 0
print mylist

输出1:

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

输出2:

[[1], [2], [3], [4], [5]]
[[0], [0], [0], [0], [0]]

我假设两个版本都会创建一个局部变量,并且不会覆盖列表本身。我想在第二版中不是这种情况。我正在使用python 2.7。 显然,我可以在for循环中使用另一个变量来生成该值的另一​​个副本。我花了一些时间才弄清楚这一点,这搞乱了我的代码功能。

解决方案:

value = list(value)

2 个答案:

答案 0 :(得分:4)

您未分配给第二个版本中的value,而是指定value引用的列表中包含的索引

Python名称是对值的引用,而不是对内存位置的引用。其中一些值是可变的,例如列表。列表包含对其他值的引用,因此value是一个列表,value[0]是列表中包含的引用。

要更改第一个示例中的列表,请使用枚举中的index来更改列表中的索引:

for index, value in enumerate(somelist):
    somelist[index] = 0

如果您希望更改第二个示例中的嵌套列表,则应该复制它们:

for index, value in enumerate(somelist):
    value = value[:]  # full list slice, same as a copy.

答案 1 :(得分:0)

这是另一种本地复制列表的pythonic方法:

mylist= [[1],[2],[3],[4],[5]]
print mylist
mylst = []
for index, value in enumerate(mylist):
    mylst += [[value[0]]]
print mylst