首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python walrus运算符在范围内失败

Python walrus运算符在范围内失败
EN

Stack Overflow用户
提问于 2020-04-09 16:05:07
回答 1查看 151关注 0票数 2

为什么我可以用这样的方法

代码语言:javascript
复制
import numpy as np

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

但是下面这些都失败了?

代码语言:javascript
复制
foo = list(range(256))
for i in range( (l := len(foo)) // 16 + 0 if l%16 == 0 else 1 ):
    print(i)
代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-09 16:16:27

在参数列表中,表达式从左到右计算,因此在:

代码语言:javascript
复制
plt.plot( range( len( (Y := foo) )), Y )

第一个参数range( len( (Y := foo) ))是在第二个参数Y之前计算的,因此在将Y作为第二个参数引用之前,Y是用foo定义的。

但是,在条件表达式中,if子句中的表达式在计算输出表达式之前对表达式进行计算,因此如下所示:

代码语言:javascript
复制
(l := len(foo)) // 16 + 0 if l%16 == 0 else 1

首先对l%16 == 0进行评估,因为此时还没有定义l,因此它会引发所述的NameError

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

代码语言:javascript
复制
for i in range( l // 16 + 0 if (l := len(foo))%16 == 0 else 1 ):
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61125379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档