Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过局部空间中的函数更改该局部空间中的值_Python_Variables_Namespaces - Fatal编程技术网

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开发人员。你能解释得更清楚一点吗?别理我,我的例子是不好的,正如上面所指出的,但有一些用途。