为什么会这样?
版本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)
答案 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