您在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:我最终棉花,是的。 :-) –