我与海象运算符:= (与:=有关)四处游玩,这将在python3.8中提供。
使用
def f(x):
return x**3
old_list = = list(range(9))这如预期的那样工作(不要介意这个例子毫无意义.):
new_list = [fx for x in old_list if (fx := f(x)) in {1, 8, 343}]
# [1, 8, 343]这是有效的,并且正在运行,但是返回一些意想不到的内容:
new_list = [fx := f(x) for x in old_list if fx in {1, 8, 343}]
# []这里发生了什么事?
发布于 2019-07-10 11:48:36
你的第二个博士不是“那个”有效的:
>>> 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 :=在它之外创建一个变量:
>>> 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绑定到0if fx in {1, 8, 343},fx是旧的512,这是假的我们可以这样反复核对这种解释:
>>> [print("no no no") for x in old_list if fx in {1, 8, 343}]
[]no no no从不打印,因此这一面永远不会被执行(因为fx是512,而不是在set中)。
https://stackoverflow.com/questions/56968804
复制相似问题