python给变量赋值范围_关于lambda:在Python中将变量赋值给本地函数范围
我想給一個lambda的作用域分配一個變量,這個lambda被多次調用。每次都有一個新的變量實例。我該怎么做?
f = lambda x: x + var.x - var.y
# Code needed here to prepare f with a new var
result = f(10)
在本例中,它是var,我希望在每次調用時都替換它,而不將其作為第二個參數。
不要使用lambda,使用常規函數,你不應該覺得有必要盡可能使用lambda。
一般來說,如果lambda足夠復雜,以至于您必須詢問如何扭曲它來完成任務,那么只需使用常規的"def"函數即可。它將使代碼更可讀、更可維護。
@我同意。但是lambda或者正則函數,我不確定OP是如何完成他所要求的。在不使用參數的情況下,如何更改函數范圍內的某些內容?
如果這有幫助,可以用常規函數替換lambda。我只需要以某種方式操作函數局部變量/閉包。
如何在python中修改本地名稱空間或如何動態修改函數的本地名稱空間的可能副本?@JonathonReinhart有幾種方法,但在那些鏈接中看不到干凈的方法。
@正在引用命名空間的Jamyak。這真的適用于函數范圍的變量嗎?
@JonathonReinhart是的,另外Op規定他不能在lambda定義中添加另一個參數,因此沒有其他方法
@查米拉克,對。整個事情開始顯得荒謬起來。
lambda是在外部定義的,超出了我的控制范圍,但我想為lambda創建者提供一個范圍。這樣做更有意義嗎?
在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時將y綁定到一個對象(即創建一個閉包),通常會看到這個習語…
>>> y = 1
>>> f = lambda x, y=y: x + y
>>> f(1)
2
>>> y = 2
>>> f(1)
2
…因此,在定義lambda后,對y的更改沒有效果。
該函數的反匯編顯示…
>>> import dis
>>> dis.dis(f)
1 ? ? ? ? ? 0 LOAD_FAST ? ? ? ? ? ? ? ?0 (x)
3 LOAD_FAST ? ? ? ? ? ? ? ?1 (y)
6 BINARY_ADD
7 RETURN_VALUE
。
雖然這很漂亮,而且是手術室的要求,但我為必須保持這一點的可憐的小混蛋感到抱歉。"在這個lambda里,y到底是從哪里來的?!"在本例中可能很明顯,但在更大的項目中則不明顯。記住python的成語"顯式而非隱式"…我不認為這是明確的。
@喬納森·萊因哈特,我同意。我主要是因為其他答案暗示這是不可能的,所以我只是想證明這是可能的。這是不是一個好主意是主觀的。對于OP想要實現的目標,可能有一個更好的解決方案,但是最初的問題并沒有包含足夠的信息來做出決定。
f = functools.partial(lambda var, x: x + var.x - var.y, var)將為您提供一個參數(x的函數(f,其中var固定在定義點的值上。
不能在lambda表達式中使用賦值語句,因此必須使用正則命名函數:
def f(x):
global var
var = x
號
注意使用"global"關鍵字。如果沒有它,python將假定您想要在函數的本地范圍內創建一個新的"var"變量。
UPS。抱歉,假定您要分配給變量,而不是對象字段。在這種情況下不需要"全局"(因為您沒有引入新的綁定)。
我不認為使用一個全局來"為一個函數的作用域分配一個變量"。這是一個全局范圍的變量。
我不確定這對我的案件有什么幫助?
@jonasklemming如果變量在全局范圍內,那么從外部更改它將在任何地方更改它,包括在函數內部。這是個壞主意,但會奏效的。
我同意這是一個糟糕的答案。我誤解了這個問題。
啊,好吧,也許使用全局是一個解決方案。
為什么不能在lambda表達式中使用賦值語句?
因為賦值只能用作語句,所以它不是有效的表達式。
使其成為另一個參數:
f = lambda x,var: x + var.x - var.y
result = f(10, var)
lambda或正則函數,在函數范圍內更改變量的唯一方法是通過參數。
謝謝,這是我的第一個想法,但我想避免第二次爭吵。
那么你還能怎么做呢?如何控制每次調用f時var是什么?
我希望有一種方法可以操縱F的關閉
在這種情況下,是的,重新定義lambda,每個你想使用它的地方。似乎很傻很費解。(即難以理解、維護等)
為什么要避免第二次爭吵?如果你想要兩個數據,為什么要掩蓋它?
是的,這不是一個可以接受的解決方案,也許這是不可能的。
避免兩個參數的原因是第二個參數很少使用,但有些情況下需要它,我希望盡可能地保持lambda的瑣碎。
好吧,但如果不使用,那么什么是var?這變得如此復雜。也許你需要提供更多的信息/代碼來幫助我們理解你到底想做什么。我會考慮刪除整個問題并重新開始。
不過,謝謝您的意見!
總結
以上是生活随笔為你收集整理的python给变量赋值范围_关于lambda:在Python中将变量赋值给本地函数范围的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 除尘设备冒黑烟咋回事?
- 下一篇: 为什么有些人特别招蚊子咬