我想將一個變量賦值給多次調用的lambda的作用域。每次都有一個新的變量實例。我怎麼做?在Python中將變量賦值給本地函數的作用域
f = lambda x: x + var.x - var.y
# Code needed here to prepare f with a new var
result = f(10)
在這種情況下,它的變種,我想,以取代每次調用它不是一個有第二個參數。
我想將一個變量賦值給多次調用的lambda的作用域。每次都有一個新的變量實例。我怎麼做?在Python中將變量賦值給本地函數的作用域
f = lambda x: x + var.x - var.y
# Code needed here to prepare f with a new var
result = f(10)
在這種情況下,它的變種,我想,以取代每次調用它不是一個有第二個參數。
在lambda
範圍內未定義的變量將從調用範圍調用它的位置解析。
稍微簡單的例子...
>>> y = 1
>>> f = lambda x: x + y
>>> f(1)
2
>>> y = 2
>>> f(1)
3
...所以你只需要調用你lambda
之前設置在呼叫範圍var
,雖然這是比較常用的情況下,使用y
是「不變」。
該函數的反彙編顯示...
>>> import dis
>>> dis.dis(f)
1 0 LOAD_FAST 0 (x)
3 LOAD_GLOBAL 0 (y)
6 BINARY_ADD
7 RETURN_VALUE
如果你想在定義lambda
(即創建一個closure)的點結合y
一個對象,它經常可以看到這個成語......
>>> y = 1
>>> f = lambda x, y=y: x + y
>>> f(1)
2
>>> y = 2
>>> f(1)
2
...從而改變y
定義lambda
後沒有EFF等。
該函數的反彙編顯示...
>>> import dis
>>> dis.dis(f)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 BINARY_ADD
7 RETURN_VALUE
雖然這很漂亮,而且OP的要求是什麼,但我爲可憐的shmuck必須保持這一點感到遺憾。 「這個地獄是從哪裏來的呢?」在這個例子中可能很明顯,但不是在一個更大的項目中。記住python的成語「明確的隱含的」......我不認爲這是明確的。 –
@JonathonReinhart我同意。我主要發佈這個,因爲其他答案意味着這是不可能的,所以我只是想證明它是*可能*。不管它是否是一個好主意*都是主觀的。對於OP想要實現的內容可能有更好的解決方案,但原始問題並未包含足夠的信息來做出決定。 – Aya
讓它另一個參數:
f = lambda x,var: x + var.x - var.y
result = f(10, var)
拉姆達或常規功能,你可以改變一個函數的範圍變量的唯一方法是通過一個參數。
謝謝,這是我的第一個想法,但我想避免第二個參數。 –
那麼你還能怎麼做呢?你如何控制每個'f'調用的'var'? –
我希望有一種方法來操縱f –
不能使用賦值語句lambda表達式,所以你必須使用一個定期開展評選功能:
def f(x):
global var
var = x
注意使用「全球」關鍵字。沒有它,Python會假設你想在函數的本地範圍內創建一個新的「var」變量。
Upps。對不起,假設你想分配給一個變量,而不是一個對象字段。在這種情況下不需要「全局」(因爲您沒有引入新的綁定)。 – adolfopa
我不認爲使用全局變量「將變量賦值給」函數的範圍。這是一個全局範圍的變量。 –
我不確定這對我有幫助嗎? –
不使用'lambda',使用常規的功能,你不應該感到需要使用'lambda's儘可能 – jamylak
在一般來說,如果一個lambda足夠複雜以至於你不得不要求如何扭曲它來完成任務,那麼只需使用常規的「def」函數即可。它會導致更易讀,更易維護的代碼。 –
@jamylak我同意。但是lambda或常規函數,我不確定OP如何完成他所要求的。你如何改變函數範圍內的某些內容,而不使用參數? –