您在setter()
功能設置本地變量x
。賦值給函數中的名稱會將其標記爲本地名稱,除非您明確地告訴Python編譯器。
在Python 3,你可以使用關鍵字nonlocal
明確標示x
作爲非本地:
def make_adder_and_setter(x):
def setter(n):
nonlocal x
x = n
return (lambda y: x + y, setter)
現在x
被標記爲自由變量,而是在分配給在周邊範圍內擡頭。
在Python 2中,您不能標記爲Python本地。您唯一的其他選項是將x
標記爲global
。您必須使用技巧來改變位於周圍範圍內的可變對象所包含的值。例如:
屬性上setter
函數將工作,例如; setter
是本地make_adder_and_setter()
範圍,該對象的屬性將是任何有訪問setter
可見:
def make_adder_and_setter(x):
def setter(n):
setter.x = n
setter.x = x
return (lambda y: setter.x + y, setter)
另一個技巧是使用一個可變的容器,如一個列表:
def make_adder_and_setter(x):
x = [x]
def setter(n):
x[0] = n
return (lambda y: x[0] + y, setter)
在這兩種情況下,你是而不是分配給一個本地名稱了;第一個示例使用setter
對象上的屬性分配,第二個示例更改x
列表,而不是分配給x
本身。
@Wooble:我最終棉花,是的。 :-) –