Python中的海象运算符在while循环中的应用

21

我正在尝试理解海象赋值运算符。

经典的while循环在循环内部将条件重新分配为False时中断。

x = True
while x:
    print('hello')
    x = False
为什么使用海豹运算符时这不起作用?它忽略了对x的重新赋值,导致出现无限循环。
while x := True:
    print('hello')
    x = False

7
每次到达循环的顶部,都会评估x := True。因此,测试的x值始终为Truex = False没有被忽略。x := True更改x的绑定为True,而不管x原来绑定到什么。 - Tim Peters
明白了!太糟糕了。我真的很想让它工作!呵呵。 - Кафка
2个回答

33

您似乎认为在进入循环之前只会进行一次赋值操作,但事实并非如此。重新赋值发生在检查条件之前,在每次迭代中都会发生。

x := True将始终为真,无论其他代码如何,这意味着条件将始终计算为真。


我真的很好奇:是什么让人们来到这个问题?是否存在一个普遍的误解,即在条件中使用:=只会执行一次,还是与无关问题有关?如果是后者,我几乎觉得这个问题可以“重新定位”,以更好地利用流量。 - Carcigenicate
3
我第一次访问这个问题时,它是前者。现在,它变成了后者。@Carcigenicate - OrOrg

6

假设我们有一段代码:

>>> a = 'suhail'
>>> while len(a) < 10:
...   print(f"too small {len(a)} elements expected at least 10")
...   a += '1'

赋值表达式可以避免两次调用len

>>> a = 'suhail'
>>> while (n := len(a)) < 10:
...   print(f"too small {n} elements expected at least 10")
...   a += '1'
... 
too small 6 elements expected at least 10
too small 7 elements expected at least 10
too small 8 elements expected at least 10
too small 9 elements expected at least 10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接