1

为什么会这样?

版本 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)
4

2 回答 2

4

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

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

要更改第一个示例中的列表,请使用indexfrom enumerate 更改列表中的索引:

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

如果您希望第二个示例中的嵌套列表发生更改,则应制作它们的副本:

for index, value in enumerate(somelist):
    value = value[:]  # full list slice, same as a copy.
于 2013-03-17T18:14:52.510 回答
0

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

mylist= [[1],[2],[3],[4],[5]]
print mylist
mylst = []
for index, value in enumerate(mylist):
    mylst += [[value[0]]]
print mylst
于 2013-03-19T05:37:26.647 回答