【问题标题】:Global and local scope in pythonpython中的全局和局部范围
【发布时间】:2019-06-18 14:22:52
【问题描述】:

关于python中本地和全局范围的初学者问题

X = 100
#is X a global variable?.We defined it outside the function scope
def foo():
    print(X)
    return X
#it prints 100 and even returns it
def foo():
    X = X + 10
#local error
#UnboundLocalError: local variable 'X' referenced before assignment
def foo():
    global X
    # if X is a global variable why specify again?
    X = X + 10
    return X

【问题讨论】:

标签: python python-3.x


【解决方案1】:

要修改变量的全局副本,您需要使用 global 关键字,但如果您只是访问它,则不需要 global

【讨论】:

    【解决方案2】:

    来自python website

    在 Python 中,仅在函数内部引用的变量是隐式全局的。如果一个变量在函数体的任何地方都被赋值,除非明确声明为全局变量,否则它会被假定为局部变量。

    这意味着您可以在没有global 关键字的情况下访问函数内的全局变量。如果你想改变它,你必须事先使用global关键字。

    【讨论】:

      【解决方案3】:

      globalnonlocal在我还是初学者的时候是很奇怪的东西。

      想一想:为什么我们在 Python 中需要它们?

      因为我们不需要varlet之类的东西来声明变量。

      想想Javascript,它也是动态脚本语言,与python非常相似,但需要varletconst来声明变量。

      声明变量最重要的是确定范围。

      因此,在 Python 中,我们的变量具有隐式默认作用域:定义它们的当前作用域,如果我们想更改某些变量的作用域,我们需要显式使用 globalnonlocal。强>

      =左侧的所有名称都表示定义变量。

      在执行某个范围的代码之前,Python 会预先计算所有local variables,即= 左侧的那些。 这就是你得到UnboundLocalError: local variable 'X' referenced before assignment的原因:

      def foo():
          X = X + 10
      

      所以,如果我们查找那些不在定义的当前范围内的名称,只需 遵循作用域链的规则:向上、向上、向上直到built_in

      记住=左侧的任何名称的范围都是默认的当前范围,您必须在引用它之前对其进行分配(绑定一些东西)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2017-03-05
        • 2016-11-13
        • 1970-01-01
        相关资源
        最近更新 更多