作用域
变量的定义是可将其视为指向值的名称。
对于 x = 1,这样的一个赋值语句,我们在执行后,名称 x 引用到值 1。这就像字典一样,键引用值,当然,变量和所对应的值用的是个”不可见”的字典。我们可以使用 vars 函数来返回这个字典:
>>> x = 1
>>> scope = vars()
>>> scope['x']
>1
>>> scope['x'] +=1
>2
这种“看不见的字典”称为命名空间或作用域,除全局变量外,每个函数调用都将创建一个。
>>> def foo():x=42
...
>>> x = 1
>>> foo()
>>>x
>1
在这定义了foo函数,在foo函数里定义x = 42,但是在输出x的值时发现并不是42,而是1。
需要解释的是: x =42在foo函数里作为内部作用域又叫局部变量,其局部改变不会影响全局变量(即函数外声明的变量),在这里x = 1为全局变量。
局部变量或参数与你要访问的全局变量重名,就无法直接访问全局变量,因为被局部变量遮住了
如果想要访问全局变量的参数或变量可以使用globals
globals和vars一样都属于python里面的内置函数,返回一个包含全局变量的字典(locals返回一个包含局部变量的字典)
使用globals
>>>def combine(name):
... print(name + globals()['name']) #gloabalSSSSSSSS
...
>>>name = 'Ammy'
>>>combine('Jack')
>AmmyJack
不过不使用global:
>>>def foo():
>>> x+=1
>>> print(x)
>>>x = 1
>>>foo()
UnboundLocalError: local variable 'x' referenced before assignment
提示的错误信息为在局部变量里调用全局变量
改正后,正确的代码是
>>>def foo():
>>> globals x
>>> x+=1
>>> print(x)
>>>x = 1
>>>foo()
>2
最后说一句globals返回的是一个字典形式,而gloabal是将局部变量变为全局变量