Python海象运算符在范围内失败



为什么我可以使用之类的东西

import numpy as np
print( (g := np.arange(256)**2) / np.max(g) )

但是以下失败了?

foo = list(range(256))
for i in range( (l := len(foo)) // 16 + 0 if l%16 == 0 else 1 ):
print(i)
Traceback (most recent call last):
File "test.py", line 8, in <module>
for i in range( (l := len(foo)) // 16 + 0 if l%16 == 0 else 1 ):
NameError: name 'l' is not defined

在参数列表中,表达式是从左到右求值的,因此:

plt.plot( range( len( (Y := foo) )), Y )

第一自变量range( len( (Y := foo) ))在第二自变量Y之前被求值,并且因此YY被引用为第二自变量之前被定义为foo

然而,在条件表达式中,if子句中的表达式是在对输出表达式中的任何一个进行求值之前进行求值的,因此:

(l := len(foo)) // 16 + 0 if l%16 == 0 else 1

首先评估l%16 == 0,并且由于此时还没有定义l,所以它提出所述NameError

相反,如果这确实是您想要的逻辑,您可以先在if子句中定义l

for i in range( l // 16 + 0 if (l := len(foo))%16 == 0 else 1 ):

相关内容

最新更新