为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

猛跑小猪 2021-06-10 14:21:11
我在这样的类的方法中有一个函数:class A():                   def run(self):        exit=False        def walk():             global exit             #DoStuff - change exit variable        walk()        print(exit)现在,该函数walk应该更改exit变量。但是这个变量总是False像 set before 一样在函数之外。如果此函数将此变量设置为 ,我如何更改此变量用作标志以在函数外部访问它True?我对这个变量的范围很困惑。我使用 python 3.6。
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

您当前的设置


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,它不是全局变量。您实际上是在设置一个全局变量exitin walk- 请参阅第二次调用printGive 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。


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




查看完整回答
反对 回复 2021-06-15
?
慕容3067478

TA贡献1773条经验 获得超3个赞

您可以在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 中的保留关键字,因此如果您不想破坏语言,则应避免为变量指定该名称。


查看完整回答
反对 回复 2021-06-15
  • 2 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信