保证无论你如何修改变量本身,迭代变量都将始终遵循原始序列?
doc没有提及此事。
我在其他地方看过类似的问题,但没有一个给出权威的答案。我已经测试了100次,它工作了100次,但我仍然不确定这是否有保证。所以请提供一些参考。
答案 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