for循环在python中不是infinate
为什么这个for循环不是无限的,这里在一个列表上循环并在循环中重新定义列表for循环在python中不是infinate,python,Python,为什么这个for循环不是无限的,这里在一个列表上循环并在循环中重新定义列表 a = [1,2,3,4,5,6,7,8,9] for i in a: print i a = [1,2,3,4,5,6,7,8,9] output : 1,2,3,4,5,6,7,8,9 我不知道,你为什么需要这个,但这个可能会帮你 a = [1,2,3,4,5,6,7,8,9] for i in a: print i a.append(10) #or anything else-))
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a = [1,2,3,4,5,6,7,8,9]
output : 1,2,3,4,5,6,7,8,9
我不知道,你为什么需要这个,但这个可能会帮你
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a.append(10) #or anything else-))
查看代码中发生了什么 我不知道,你为什么需要这个,但这个可能会对你有帮助
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a.append(10) #or anything else-))
查看代码中发生了什么 由于未修改
a
(您只是将其设置为相同的值),因此for
循环按预期进行。您所期望的是,当重新分配a
时,for
循环将重新启动,但这不会发生
相反,要使其无限大,请尝试:
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a.append(i)
由于未修改
a
(您只是将其设置为相同的值),因此for
循环按预期进行。您所期望的是,当重新分配a
时,for
循环将重新启动,但这不会发生
相反,要使其无限大,请尝试:
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a.append(i)
您甚至可以不仅修改列表的内容,还可以修改变量的值,您将得到相同的结果
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a = "Hello World!"
在
for
的中,会加载值,因此不会考虑循环内的任何修改。您甚至可以不仅修改列表的内容,还可以修改变量的值,这样您将得到相同的结果
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a = "Hello World!"
在for
中加载值,因此不会考虑循环内的任何修改。粗略地说,循环不是无限的,因为i
绑定到的迭代器在代码执行到达for时被绑定。在
循环中。之后,所有后续调用都将调用iter.next()
,这将把现有迭代器移动到下一个位置,而不考虑a
的任何后续重新定义
回想一下,阵列有一个名为\uuuu iter\uuuu
(或iter
)的内置函数。然后,您的for
循环相当于:
a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(a)
try:
while True:
print next(it) # for compatibility you may want to use next(it)
a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
except StopIteration:
pass
请注意,在上面的等效代码中,a
的任何更改都不会影响i
,因为i
已绑定到循环第一个[1,2,3,4,5,6,7,8,9]
的迭代器
您可以通过更改a的第一个值来观察这一点:
a = [ 1, 2, 3, 4 ]
for i in a:
print i
a = [ 5, 4, 3, 2, 1 ]
请注意,a=[5,4,3,2,1]
不会更改第一行的[1,2,3,4]
的存在,因为该数组已经存在于内存中。随后的每个调用都分配一个新数组并将其分配给a
粗略地说,循环不是无限的,因为i
绑定到的迭代器是在代码执行到达时绑定的。在
循环中。之后,所有后续调用都将调用iter.next()
,这将把现有迭代器移动到下一个位置,而不考虑a
的任何后续重新定义
回想一下,阵列有一个名为\uuuu iter\uuuu
(或iter
)的内置函数。然后,您的for
循环相当于:
a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(a)
try:
while True:
print next(it) # for compatibility you may want to use next(it)
a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
except StopIteration:
pass
请注意,在上面的等效代码中,a
的任何更改都不会影响i
,因为i
已绑定到循环第一个[1,2,3,4,5,6,7,8,9]
的迭代器
您可以通过更改a的第一个值来观察这一点:
a = [ 1, 2, 3, 4 ]
for i in a:
print i
a = [ 5, 4, 3, 2, 1 ]
请注意,a=[5,4,3,2,1]
不会更改第一行的[1,2,3,4]
的存在,因为该数组已经存在于内存中。随后的每个调用都分配一个新数组并将其分配给a
无论您是否在迭代期间重新分配循环,循环都将继续。它不会回到开始…为什么在变量a
已经启动循环后,您会期望它会对循环产生任何影响?@AndrewLi是的,您是对的,这就是它所显示的行为,但是我要对这一点做一个详细的解释。@AChampion为什么不能在python允许的情况下进行这样的实验呢?你可以,我是在问为什么你认为这会影响已经绑定的循环?例如b=a;a=[1,2,3]
后一个赋值对b
没有影响。无论您在迭代过程中是否重新赋值,循环都将继续。它不会回到开始…为什么在变量a
已经启动循环后,您会期望它会对循环产生任何影响?@AndrewLi是的,您是对的,这就是它所显示的行为,但是我要对这一点做一个详细的解释。@AChampion为什么不能在python允许的情况下进行这样的实验呢?你可以,我是在问为什么你认为这会影响已经绑定的循环?例如b=a;a=[1,2,3]
后一个赋值对b
没有影响。改变你正在迭代的对象是个坏主意:我更喜欢a.append(I)
,它将一些模式带到无穷远:)@AChampion,我知道它不好。事实上,它是非常没有意义的,甚至不是坏的-)@TomR当然,但当你处理荒谬的事情时,似乎没有什么是合理的-)改变你正在迭代的对象是个坏主意:我更喜欢a.append(I)
,它带来了无限的模式:)@AChampion,我知道它是坏的。事实上,这是非常没有意义的,甚至不是坏的-)@当然,但当你处理荒谬的事情时,似乎没有什么是合理的-)我认为这个答案最能解释正在发生的事情,但我认为有一些事情比它们需要的更令人困惑。首先,我不会将For循环中的I
值与生成它的迭代器混淆。为迭代器使用不同的名称,如it
。我还将使用iter
内置生成迭代器,而不是直接在列表上调用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我还建议使用next(it)
而不是it.next()
。建造