2013-05-15 30 views
1

我想將一個變量賦值給多次調用的lambda的作用域。每次都有一個新的變量實例。我怎麼做?在Python中將變量賦值給本地函數的作用域

f = lambda x: x + var.x - var.y 

# Code needed here to prepare f with a new var 

result = f(10) 

在這種情況下,它的變種,我想,以取代每次調用它不是一個有第二個參數。

+2

不使用'lambda',使用常規的功能,你不應該感到需要使用'lambda's儘可能 – jamylak

+2

在一般來說,如果一個lambda足夠複雜以至於你不得不要求如何扭曲它來完成任務,那麼只需使用常規的「def」函數即可。它會導致更易讀,更易維護的代碼。 –

+0

@jamylak我同意。但是lambda或常規函數,我不確定OP如何完成他所要求的。你如何改變函數範圍內的某些內容,而不使用參數? –

回答

8

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 
+0

雖然這很漂亮,而且OP的要求是什麼,但我爲可憐的shmuck必須保持這一點感到遺憾。 「這個地獄是從哪裏來的呢?」在這個例子中可能很明顯,但不是在一個更大的項目中。記住python的成語「明確的隱含的」......我不認爲這是明確的。 –

+1

@JonathonReinhart我同意。我主要發佈這個,因爲其他答案意味着這是不可能的,所以我只是想證明它是*可能*。不管它是否是一個好主意*都是主觀的。對於OP想要實現的內容可能有更好的解決方案,但原始問題並未包含足夠的信息來做出決定。 – Aya

-1

讓它另一個參數:

f = lambda x,var: x + var.x - var.y 
result = f(10, var) 

拉姆達或常規功能,你可以改變一個函數的範圍變量的唯一方法是通過一個參數。

+0

謝謝,這是我的第一個想法,但我想避免第二個參數。 –

+1

那麼你還能怎麼做呢?你如何控制每個'f'調用的'var'? –

+0

我希望有一種方法來操縱f –

0

不能使用賦值語句lambda表達式,所以你必須使用一個定期開展評選功能:

def f(x): 
    global var 
    var = x 

注意使用「全球」關鍵字。沒有它,Python會假設你想在函數的本地範圍內創建一個新的「var」變量。

+1

Upps。對不起,假設你想分配給一個變量,而不是一個對象字段。在這種情況下不需要「全局」(因爲您沒有引入新的綁定)。 – adolfopa

+0

我不認爲使用全局變量「將變量賦值給」函數的範圍。這是一個全局範圍的變量。 –

+1

我不確定這對我有幫助嗎? –