Python(第七章 作用域)

作用域

变量的定义是可将其视为指向值的名称。
对于 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是将局部变量变为全局变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值