声明和表达

时间:2016-09-17 03:37:59

标签: python while-loop

只要表达式为true,就会执行

while循环语句。

第10次之后,pop()会抛出一个IndexError,因为列表中有10个元素。但是,下面的代码执行正常,没有任何错误。为什么会这样?

a = [x*x for x in range(10)]
while a.pop():
    print("elements in the list")

这可能是一个非常基本的问题,但我正在努力使用Python。

2 个答案:

答案 0 :(得分:3)

  

第10次之后,pop()会抛出一个IndexError,因为列表中有10个元素。

不,代码永远不会尝试在10日之后执行任何pop,因为第10个pop会返回0。在布尔上下文中,0被视为false,因此循环在该点终止。

答案 1 :(得分:2)

目前还不清楚你的问题是什么。如果我执行你的代码,它会(我认为)你期望。 0可能导致意外行为:

>>> a = [x*x for x in range(10)]
>>> while a.pop():
...    print a
... 
[0, 1, 4, 9, 16, 25, 36, 49, 64]
[0, 1, 4, 9, 16, 25, 36, 49]
[0, 1, 4, 9, 16, 25, 36]
[0, 1, 4, 9, 16, 25]
[0, 1, 4, 9, 16]
[0, 1, 4, 9]
[0, 1, 4]
[0, 1]
[0]

更多 Pythonic 仅测试列表本身而不是.pop()的结果,因为这将终止任何虚假项目的循环:

>>> li=[1,2,3,False,4,5]
>>> while li.pop():
...    print li
... 
[1, 2, 3, False, 4]
[1, 2, 3, False]

您可以看到while循环在遇到来自pop的False时终止。

更典型的做法是:

>>> li=[1,2,3,False,4,5]
>>> while li:
...    e=li.pop()
...    print e, li
... 
5 [1, 2, 3, False, 4]
4 [1, 2, 3, False]
False [1, 2, 3]
3 [1, 2]
2 [1]
1 []

在列表变为false时终止。

更好的是(在Python中)使用对列表无破坏性的for循环:

>>> li=[1,2,3,False,4,5]
>>> for e in li:
...    print e, li
... 
1 [1, 2, 3, False, 4, 5]
2 [1, 2, 3, False, 4, 5]
3 [1, 2, 3, False, 4, 5]
False [1, 2, 3, False, 4, 5]
4 [1, 2, 3, False, 4, 5]
5 [1, 2, 3, False, 4, 5]