Python 通过局部空间中的函数更改该局部空间中的值
下面是一个示例代码:Python 通过局部空间中的函数更改该局部空间中的值,python,variables,namespaces,Python,Variables,Namespaces,下面是一个示例代码: def foo(): def bar(): foobar = 'foobaz' foobar = 'foobar' print foobar bar() print foobar foo() 我想通过函数bar在foo内部更改变量foobar。上面的代码不起作用,因为foobar内部bar与foo中的foobar位于单独的命名空间中。一个简单的解决方法是制作一个全局的foobar,并让foo和bar都可以访问它,
def foo():
def bar():
foobar = 'foobaz'
foobar = 'foobar'
print foobar
bar()
print foobar
foo()
我想通过函数
bar
在foo
内部更改变量foobar
。上面的代码不起作用,因为foobar
内部bar
与foo
中的foobar
位于单独的命名空间中。一个简单的解决方法是制作一个全局的foobar
,并让foo
和bar
都可以访问它,但我希望有更简单的解决方法。您正在寻找非本地的关键字,它存在于3.x中
def f():
x = None
def g():
nonlocal x
x = 1
如果您被困在2.x中,您可以通过拥有一个列表或类似的可变数据容器并作为一种解决方法来访问它
def f():
x = [None]
def g():
x[0] = 1
这是因为变量确实在范围内,但不会泄漏到范围外。对于可变对象,我们可以在作用域内更改它们,这些更改会传播出去。您正在查找非本地的关键字,它存在于3.x中
def f():
x = None
def g():
nonlocal x
x = 1
如果您被困在2.x中,您可以通过拥有一个列表或类似的可变数据容器并作为一种解决方法来访问它
def f():
x = [None]
def g():
x[0] = 1
这是因为变量确实在范围内,但不会泄漏到范围外。对于可变对象,我们可以在作用域内更改它们,这些更改会传播出去。在python 2.7中是不可能的。在python 3中:
def foo():
def bar():
nonlocal foobar
foobar = 'foobaz'
foobar = 'foobar'
print foobar
bar()
print foobar
foo()
在2.x中,您可以执行以下操作:
def foo():
foobar = []
def bar():
foobar[0] = 'foobaz'
foobar[0] = 'foobar'
print foobar[0]
bar()
print foobar[0]
foo()
在Python2.7中不可能。在python 3中:
def foo():
def bar():
nonlocal foobar
foobar = 'foobaz'
foobar = 'foobar'
print foobar
bar()
print foobar
foo()
在2.x中,您可以执行以下操作:
def foo():
foobar = []
def bar():
foobar[0] = 'foobaz'
foobar[0] = 'foobar'
print foobar[0]
bar()
print foobar[0]
foo()
在Python3.x上,您可以使用非本地
,在Python2.x上,请尝试使用函数属性:
def foo():
def bar():
foo.foobar = 'foobaz' #change the function attribute
foo.foobar = 'foobar' #declare as function attribute
print foo.foobar
bar()
print foo.foobar
foo()
输出:
foobar
foobaz
在Python3.x上,您可以使用非本地
,在Python2.x上,请尝试使用函数属性:
def foo():
def bar():
foo.foobar = 'foobaz' #change the function attribute
foo.foobar = 'foobar' #declare as function attribute
print foo.foobar
bar()
print foo.foobar
foo()
输出:
foobar
foobaz
即使函数在Python中已经是第一类对象,您也可以创建自己的“functor”或函数对象,如下所示:
class Foo(object):
def bar(self):
self.foobar = 'foobaz'
def __call__(self):
self.foobar = 'foobar'
print self.foobar
self.bar()
print self.foobar
foo = Foo()
foo()
即使函数在Python中已经是第一类对象,您也可以创建自己的“functor”或函数对象,如下所示:
class Foo(object):
def bar(self):
self.foobar = 'foobaz'
def __call__(self):
self.foobar = 'foobar'
print self.foobar
self.bar()
print self.foobar
foo = Foo()
foo()
那么这个用例是什么呢?它可以在py3中使用非本地,但是。。。still@JonClements我以前需要这样做。@JonClements举个例子:-在给定的值上拆分一个iterable。@Lattyware:由于我被足球分心,我可能只是遗漏了一些明显的东西,但我不明白为什么该函数需要非本地
,或者分组键
。@Lattyware好的,我确信它有用途,但我不相信这是最好的例子。。。ie:[列出k的(g),如果k在groupby(el,bool)中的g]
这个用例是什么?它可以在py3中使用非本地,但是。。。still@JonClements我以前需要这样做。@JonClements举个例子:-在给定的值上拆分一个iterable。@Lattyware:由于我被足球分心,我可能只是遗漏了一些明显的东西,但我不明白为什么该函数需要非本地
,或者分组键
。@Lattyware好的,我确信它有用途,但我不相信这是最好的例子。。。ie:[list(g)for k,g in groupby(el,bool)if k]
您假定bar()
将由该函数调用,但情况可能并非如此。但它在foo方法中根据给定的示例代码进行调用,这很容易实现,仅用于示例。有关反例的示例,请参见此处:。请原谅我的天真。我刚开始是一名python开发人员。你能解释得更清楚一点吗?别理我,我的例子不好,正如上面所指出的,但也有一些用途。你是在假设bar()
将被该函数调用,但事实并非如此。但它是根据给定的示例代码在foo方法中被调用的,仅针对该示例就可以轻松完成。有关反例的示例,请参见此处:。请原谅我的天真。我刚开始是一名python开发人员。你能解释得更清楚一点吗?别理我,我的例子是不好的,正如上面所指出的,但有一些用途。