[英]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.