我正在循环循环通过一个元组列表,每次迭代,我都在当前循环变量上附加一些额外的元素,然后用新列表执行操作。
诱惑是修改循环变量以包含额外的元素,然后对其进行操作。
考虑以下代码段:
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]