首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >海象算子:如果有奇怪的结果

海象算子:如果有奇怪的结果
EN

Stack Overflow用户
提问于 2019-07-10 10:31:41
回答 1查看 542关注 0票数 2

我与海象运算符:= (与:=有关)四处游玩,这将在python3.8中提供。

使用

代码语言:javascript
复制
def f(x):
    return x**3

old_list =  = list(range(9))

这如预期的那样工作(不要介意这个例子毫无意义.):

代码语言:javascript
复制
new_list = [fx for x in old_list if (fx := f(x))  in {1, 8, 343}]
# [1, 8, 343]

这是有效的,并且正在运行,但是返回一些意想不到的内容:

代码语言:javascript
复制
new_list = [fx := f(x) for x in old_list if fx in {1, 8, 343}]
# []

这里发生了什么事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-10 11:48:36

你的第二个博士不是“那个”有效的:

代码语言:javascript
复制
>>> old_list = list(range(9))
>>> f = lambda x: x ** 3
>>> [fx := f(x) for x in old_list if fx in {1, 8, 343}]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <listcomp>
NameError: name 'fx' is not defined
>>> 

解释

在第一个列表理解( [fx for x in old_list if (fx := f(x)) in {1, 8, 343}] )中,fx :=在它之外创建一个变量:

代码语言:javascript
复制
>>> old_list = list(range(9))
>>> f = lambda x: x ** 3
>>> [fx for x in old_list if (fx := f(x))  in {1, 8, 343}]
[1, 8, 343]
>>> fx
512

如果您在之后运行[fx := f(x) for x in old_list if fx in {1, 8, 343}],它将如下所示:

  • for x in old_list将x绑定到0
  • if fx in {1, 8, 343},fx是旧的512,这是假的
  • 由于if是假的,"select“(左)部分没有执行,没有对f的调用,没有fx的重新绑定,fx仍然是512。
  • 将x赋值为old_list的第二个元素,为1
  • ..。

我们可以这样反复核对这种解释:

代码语言:javascript
复制
>>> [print("no no no") for x in old_list if fx in {1, 8, 343}]
[]

no no no从不打印,因此这一面永远不会被执行(因为fx是512,而不是在set中)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56968804

复制
相关文章

相似问题

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