【发布时间】:2020-07-26 05:12:44
【问题描述】:
这里我们修改字符串s,同时在其上循环:
s = 'hello'
for c in s:
s += c
print(s)
它不会生成无限循环(它可以:我们在每次迭代中添加一个新字符!)。
多年来我就知道这一点,但我无法真正解释为什么。这与字符串不变性有关还是无关?
在做for c in s:时,在开始循环之前,是不是在内存中复制了原来的s?
另一种情况,我认为可以生成无限循环,但它不会:
s = 'hello'
def f(x):
i = 0
while True:
try:
yield x[i]
except IndexError:
break
i += 1
for c in f(s):
s += c
print(s)
【问题讨论】:
-
你是对的。它遍历原始对象。将名称重新绑定到新对象不会更改 for 循环,因为它不会在每次迭代时解析名称。
-
f(s)在循环开始期间仅被评估一次。它使用初始字符串对象创建一个生成器。随后将s重新分配给s += c中的某个其他对象不会影响原始对象,因为+=创建了一个新的str对象 -
from itertools import cycle;for c in cycle('hello') # loop forever -
@rdas 是的,我的
def f(x): return x示例无关紧要,因为在循环之前对输出进行了一次评估;我修改了yield,这里可能问题更大! -
官方
for循环文档可以help
标签: python string loops immutability