【问题标题】:About the global keyword in python关于python中的global关键字
【发布时间】:2012-04-13 10:09:46
【问题描述】:
# coding: utf-8

def func():
    print 'x is', x
    #x = 2   #if I add this line, there will be an error, why?
    print 'Changed local x to', x
x = 50
func()
print 'Value of x is', x 
  1. 我没有在func函数中添加global x,但仍然可以找到x是50,为什么?
  2. 我在func函数中添加x=2行时​​,会报错(UnboundLocalError: local variable 'x' referenced before assignment),为什么?

【问题讨论】:

  • @Marcin 如果我添加 x = 2,错误是“UnboundLocalError: local variable 'x' referenced before assignment”
  • 然后把它放在你的问题中。

标签: python


【解决方案1】:

这里的诀窍是静态检测本地名称

  • 只要函数中没有指定名称x,对x 的引用将解析为全局范围
  • 如果名称x 在函数中被指定为anywhere,Python 假定x 是函数中的本地名称everywhere。结果,第一行变成了错误,因为在分配之前使用了本地名称 x

换句话说:分配的名称在函数中的任何地方都被视为本地名称,而不仅仅是在分配点之后。

【讨论】:

    【解决方案2】:

    global 关键字仅用于写入全局变量。

    由于分配给未声明为全局变量的变量会创建该名称的局部变量,因此出现错误。您在分配之前在该范围内引用了x,因此您正在尝试读取尚未分配的局部变量。

    【讨论】:

      【解决方案3】:

      Python 使用相当典型的variable scoping。非局部变量在函数中是可见的。

      如果你想分配给全局范围内的变量,你只需要global 关键字。 您还必须注意全局范围和外部范围之间的区别。考虑影响:

      x = 'global'
      def f():
          x = 'local in f'
          def g():
              global x 
              x = 'assigned in g'
          g()
          print x
      

      在执行f() 时,上面的代码将打印local in f,而全局范围内的x 设置为'assigned in g'


      从 Python 3 开始,还有 nonlocal 关键字,它允许您从外部范围分配给变量。

      x = 'global'
      def f():
          x = 'local in f'
          def g():
              nonlocal x 
              x = 'assigned in g'
          return g
          print(x)
      

      在执行f() 时,上面的代码将在全局范围内打印'assigned in g(which is the value ofxin local scope off()), while value ofx` 保持不变。

      还值得注意的是,Python 使用词法(静态)作用域,因此以下代码不会修改全局作用域中的 x

      x = 'global'
      def f():
          x = 'local in f'
          def g():
              nonlocal x 
              x = 'assigned in g'
          return g
      g = f()
      g()
      

      【讨论】:

      • 如果您想讨论某事的技术优点,请以建设性和成熟的方式进行。不要陷入幼稚的辱骂和打架。谢谢。
      • @BoltClock'saUnicorn 我没有看到你在这个答案中提到的不尊重。哦..等等(检查英语字典中的typical)啊.. 是的 - 看起来这个词在英语中有否定的同源词,在其他语言中没有 - Vartec,作为非母语人士可能不是意识到这一点。 """ 1. 成为或充当特定类型的代表;这幅画的特点是典型的伦勃朗 2. 被认为是你典型的一些不良特征的例子!"""}(collins dict) -环游世界,第一个含义更广)
      • @jsbueno:嗯,答案并不是真正的问题......这是别的问题。
      猜你喜欢
      • 1970-01-01
      • 2011-09-30
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2018-04-04
      • 1970-01-01
      相关资源
      最近更新 更多