python中的全局和局部作用域

时间:2019-06-18 14:22:52

标签: python python-3.x

仅仅是关于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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

来自python website

  

在Python中,仅在函数内部引用的变量是隐式全局的。如果在函数体内任何位置为变量分配了值,除非明确声明为全局变量,否则假定该变量为局部变量。

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

答案 2 :(得分:1)

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

因此,如果我们查找不在当前定义范围内的那些名称, 遵循范围链的规则:向上,向上,向上直到=

记住javafx-controls-11.0.2-mac.jar左侧任何名称的范围都是默认的当前范围,在引用它之前,您必须先对其进行分配(绑定一些内容)。