我在类似这样的类的方法中有一个函数:
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。
答案 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中的保留关键字,因此,如果您不想破坏语言,则应避免为变量指定名称。