更新方法内函数内的全局变量

时间:2018-09-10 20:40:33

标签: python scope

我在类似这样的类的方法中有一个函数:

class A():               
    def run(self):

        exit=False

        def walk():
             global exit
             #DoStuff - change exit variable
        walk()
        print(exit)

现在,函数walk应该更改exit变量。但是,此变量始终像以前设置的那样False在函数外部。如果此函数将此变量设置为True,如何使用该变量作为标志来访问该函数之外的变量?我对该变量的范围感到困惑。我使用python 3.6。

2 个答案:

答案 0 :(得分:3)

您当前的设置

class A:
    def run(self):
        exit = False

        def walk():
             global exit
             exit = True
        walk()
        print(exit)

a = A()
a.run() # False
print(exit) # True

打印False是因为您在exit内打印的run处于run的范围内,它不是全局变量。您实际上是在exit中设置一个全局变量walk-请参见对print的第二次调用,并赋予True

您想要的不是global而是nonlocal关键字,它使您可以修改自由变量。但是,让我们检查一下没有global时会发生什么。

class A:
    def run(self):
        exit = False

        def walk():
             exit = True
        walk()
        print(exit)

a = A()
a.run() # False

代码显示False,因为run并不关心在walk中分配的局部变量的创建。但是添加了nonlocal

class A:
    def run(self):
        exit = False

        def walk():
             nonlocal exit
             exit = True
        walk()
        print(exit)

a = A()
a.run() # True

代码将输出True,因为exit = True现在正在exit封闭的非本地范围内设置变量run。 / p>

您应该研究其他上下文的关键主题是闭包和自由变量。

答案 1 :(得分:2)

您可以在此处使用nonlocal关键字。检查一下:

>>> def run():
...   e=False
...   print(e)
...   def walk():
...     nonlocal e
...     e=True
...     print(e)
...   walk()
...   print(e)
...
>>> run()
False
True
True

但是,这是非常糟糕的形式!将变量exit设为A类的属性是正常的。

class A():

    def __init__(self):
        self.exit = False

    def run(self):
        self.exit = False

        def walk():
            #DoStuff with self.exit variable
            self.exit = True
        walk()
        print(self.exit)

顺便说一句,exit是Python中的保留关键字,因此,如果您不想破坏语言,则应避免为变量指定名称。