簡體   English   中英

使用一行if語句進行匿名函數賦值

[英]anonymous function assignment using a one line if statement

使用一行if語句將變量賦值給匿名函數時,'else'的情況不會按預期運行。 不是分配'else'之后列出的匿名函數,而是分配不同的匿名函數。 此函數返回預期的匿名函數。

>> fn = lambda x: x if True else lambda x: x*x
>> fn(2)
2
>> fn = lambda x: x if False else lambda x: x*x
>> fn(2)
<function <lambda> at 0x10086dc08>
>> fn('foo')(2)
4

似乎正在發生的是lambda x: x if False else lambda x: x*x作為一個整體在'else'情況下作為匿名函數返回。 通過使用以下方法,我能夠實現所需的行為:

>> fn = (lambda x: x*x, lambda x: x)[True]
>> fn(2)
2
>> fn = (lambda x: x*x, lambda x: x)[False]
>> fn(2)
4

但是,我仍然想要了解這種不尋常行為的底部。 有什么想法嗎?

lambda的綁定比條件表達式弱。 實際上,它在語言中具有最少的運算符優先級。 文檔 1

在此輸入圖像描述

所以,這一行:

fn = lambda x: x if True else lambda x: x*x

實際上被Python解釋為:

fn = lambda x: (x if True else lambda x: x*x)

要做你想做的事,你需要添加括號:

fn = (lambda x: x) if True else (lambda x: x*x)

1請注意,表格從最小到最大排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM