Python 海象操作员在范围内失败
Python walrus operator fails within range
为什么我可以使用类似
的东西
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
之前求值,因此 Y
在 Y
被引用之前用 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 ):
为什么我可以使用类似
的东西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
之前求值,因此 Y
在 Y
被引用之前用 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 ):