【问题标题】:iteration for loop python [duplicate]循环python的迭代[重复]
【发布时间】:2013-03-17 18:13:41
【问题描述】:

为什么会这样?

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

【问题讨论】:

标签: python for-loop iteration


【解决方案1】:

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

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

要更改第一个示例中的列表,请使用 enumerate 中的 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.

【讨论】:

  • 那么创建新局部变量的最佳方法是什么?我尝试在第二个版本的 for 循环中重新分配值,但它仍然会更改列表中的值
  • 如果我不想更改列表,我需要如何解决?我只想要存储值的临时局部变量(抱歉混淆)
  • @Barmaley 复制列表? value = list(value)
  • @Xymotech 我试过了,我得到 TypeError: 'list' object is not callable
  • @Barmaley 那是因为您使用名称“列表”作为变量,但list 是 Python 中的保留字,用于创建列表的方法名称。将变量名称更改为 my_list = [[1],[2],[3],[4],[5]]
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    相关资源
    最近更新 更多