繁体   English   中英

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

[英]Python: Is it safe to change iteration variable inside the loop?

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

文档没有提及任何内容。

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

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

for语句文档:

for循环对目标列表中的变量进行赋值。 这将覆盖所有先前对这些变量的分配,包括在for循环套件中进行的分配:

 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')获得此信息

我同意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

我不确定这种发电机在实践中是否会有用,还是最好避免使用这种不良做法。

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

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

输出:

1
2
3

我认为语法

for item in stuff:
    ...

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

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

这取决于您所指的safe 从技术上讲,修改用于迭代的变量没有错。 当您遍历列表或其他内容时,实际上是在遍历迭代器。 它返回包含在容器中的值(列表,字典等)。

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

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

但是,如果您要在具有可变对象的容器上进行迭代(请说辞典)。通过更改内容来修改变量,将对容器中包含的值产生影响,因为它们是相同的值。

但是,执行以下操作对容器中的值完全没有影响,因为您没有修改变量名所指向的值,而是更改了变量名所指向的值:

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

虽然这将:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM