在迭代过程中突变循环变量



我正在循环循环通过一个元组列表,每次迭代,我都在当前循环变量上附加一些额外的元素,然后用新列表执行操作。

诱惑是修改循环变量以包含额外的元素,然后对其进行操作。

考虑以下代码段:

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)

但是,关于在循环过程中突变循环变量的某些东西使我感到不安。

突变循环变量时是否有任何情况会产生意外的结果,或者我可以停止担心?

注意:关于突变峰值似乎有很多讨论。这个问题是关于突变循环变量

只要您不更改集合本身,就没关系。问题仅在您尝试从最集合中添加/删除时出现,您正在迭代。

# Say something like this
for x in optional_part:
    optional_part.remove(x)

虽然大多数评论中都说了大多数答案,但可能值得注意的是,+=操作员并不总是执行重新分配。这只是tuple实现它的方式(必须由于其不变性)。元组和列表实现它相当不同:

列表 do 突变:

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

元组没有:

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

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

>>> 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]

最新更新