在迭代期间改变循环变量

时间:2017-09-29 11:59:36

标签: python

我循环遍历元组列表,每次迭代,我都会在当前循环变量中附加一些额外的元素,然后用新列表执行操作。

诱惑是修改循环变量以包含额外的元素,然后用它做一些事情。

请考虑以下代码段:

required_part = (0, 4)
optional_part = [(1, 2), (1, 3), (2,3)]

for x in optional_part:
    x += required_part
    x = sorted(x)
    print(x)

但是在循环中改变循环变量的一些事情让我感到不安。

是否有任何情况下,变更循环变量会产生意外结果或者我可以不再担心?

注意:似乎有很多discussion关于改变迭代的内容。这个问题更像是改变循环变量

3 个答案:

答案 0 :(得分:4)

只要您不改变收藏本身,就没关系。问题只有在您尝试从集合中添加/删除时才会出现,您将重复进行迭代。

# Say something like this

for x in optional_part:
    optional_part.remove(x)

答案 1 :(得分:3)

虽然在评论和其他答案中已经说过大多数,但值得注意的是+=运算符并不总是执行重新分配。它只是tuple实现它的方式(它必须具有不变性)。元组和列表以不同的方式实现它:

列出执行 mutate:

a = x = [5, 6]
a += [7]
a
# [5, 6, 7]
x
# [5, 6, 7]

Tuples不要:

a = x = (5, 6)
a += (7,)
a
# (5, 6, 7)
x
# (5, 6)

答案 2 :(得分:2)

问题是,循环变量绑定到什么?如果该值是可变的,则可以更改列表的内容,但不能更改列表本身。

>>> lst = [[1, 2], [3, 4]]
>>> for x in lst:
...  x += [5]
...
>>> print lst
[[1, 2, 5], [3, 4, 5]]

lst仍然是两个元素的相同列表,这两个元素都已更改。

如果元素不可变,则没有任何变化。

>>> lst = [1,2,3]
>>> for x in lst:
...   x += 5
...
>>> print lst
[1, 2, 3]