Python:在循环中更改迭代变量是否安全?

时间:2016-12-10 12:15:57

标签: python

保证无论你如何修改变量本身,迭代变量都将始终遵循原始序列?

doc没有提及此事。

我在其他地方看过类似的问题,但没有一个给出权威的答案。我已经测试了100次,它工作了100次,但我仍然不确定这是否有保证。所以请提供一些参考

5 个答案:

答案 0 :(得分:4)

是。在for循环中分配循环变量是完全安全的。

来自The for statement docs:

  

for循环对目标列表中的变量进行赋值。   这会覆盖以前对这些变量的所有分配,包括   在for-loop套件中制作的那些:

for i in range(10):
    print(i)
    i = 5             # this will not affect the for-loop
                      # because i will be overwritten with the next
                      # index in the range

此信息也可通过help('for')

获取

答案 1 :(得分:2)

我同意PM 2Ring的答案,但你问是否保证循环将“遵循原始序列”。对于由生成器函数定义的迭代器,这不能保证,因为序列可以在迭代之间改变;并且可以通过改变序列中的可变元素来改变生成器的工作方式。

例如:

def strange_iter():
    x = {'value': 1}
    while x['value'] < 30:
        x = {'value': x['value'] + 1}
        yield x

for d in strange_iter():
    print(d['value'])
    if d['value'] == 10:
        d['value'] = 15     # loop will skip from 10 to 16

我不确定这些发电机在实践中是否会有任何用处,或者最好被认为是一种不好的做法。

答案 2 :(得分:1)

循环将使用原始序列,例如:

a = [1, 2,3 ]
for index,number in enumerate(a):
    print(a[index])
    index = 0
    number = 0

输出:

1
2
3

答案 3 :(得分:0)

我认为语法

for item in stuff:
    ...

通过调用iter(stuff)创建一个迭代器,然后通过在该迭代器上调用next()来提取值。

答案 4 :(得分:-1)

简短回答,这取决于....

这取决于safe的含义。从技术上讲,修改用于迭代的变量没有任何错误。当你遍历列表或其他东西时,你实际上是迭代迭代器。它返回容器中包含的值(列表,dict等)......

如果修改迭代器返回的变量,则必须记住要修改的对象的可变性。

如果迭代整数或字符串,则实际上并没有修改variable,而是影响变量名的新值。因此,您不会修改容器中包含的值。

但是如果你在一个带有可变对象的容器上迭代(比如说dicts)。通过改变内容来修改变量会对容器中包含的值产生影响,因为它们是相同的值。

但是这样做会对容器中的值没有任何影响,因为你没有修改变量名指向的值,而是改变变量名指向的值:

a = [{}, {}, {}]
for x in a:
    x = {'val': x}

虽然这会:

a = [{}, {}, {}]
for x in a:
    x['v'] = 1