python变量按作用域可分为_python变量作用域

本文介绍了Python中的变量作用域,包括局部变量和全局变量的概念。局部变量在函数内部定义,函数执行完毕后消失;全局变量在整个程序范围内都可访问。通过`globals()`和`locals()`函数可以获取不同作用域内的变量字典。当函数内部重新定义全局变量时,会发生局部变量遮蔽全局变量的情况,可通过`globals()`或使用`global`声明避免这种问题。
摘要由CSDN通过智能技术生成

在程序中定于一个变量时,这个变量时有作用范围的,变量的作用范围被称为它的作用域,根据定义变量的位置,变量分为两种:

局部变量:在函数中定义的变量,包括参数,都被称为局部变量。

全局变量:在函数外面,全局范围内定义的变量,被称为全局变量。

每个函数在执行时,系统都会为该函数分配一块‘临时内存空间’,所有的局部变量都被保存在这块临时内存空间内。但函数执行完成后,这块内存空间就被释放了,这些局部变量也就消失了。

全局变量意味着他们可以在所有函数内被访问。

不管实在函数的局部范围还是全局范围内,都存在多个变量,每个变量持有该变量的值,这些变量和他们的值就想一个看不见的字典,其中变量名字就是key,变量值就是value。

实际上python提供了如下三个工具函数来获取指定范围内的‘变量词典’

globals():该函数返回全局范围内所有变量组成的‘变量字典’

local():该函数返回当前局部范围内所有变量组成的‘变量字典’

vars(object):获取在只能法定对象范围内所有变量组成的‘变量字典’,如果不传入object参数,vars()和locals()的作用完全相同。

locals()总是获取当前局部范围内所有变量组成的‘变量字典’,因此,如果在全局范围内调用locals()函数,同样获取全局范围内所有变量组成的‘变量字典’,globals()无论在哪执行总是获取全局范围内所有变量组成的‘变量字典’

>>> def test():

age=20

print(age)

print(locals())

print(locals()['age'])

locals()['age']=12

print('现在的age:',age)

globals()['x']=55

>>> test()

20

{'age': 20}

20

现在的age: 20

>>> x

55

>>> x=5

>>> x

5

>>> test()

20

{'age': 20}

20

现在的age: 20

>>> x

55

全局变量默认可以在所有函数内被访问,但是如果在函数中定义了与全局变量同名的变量,此时就会发生局部变量遮蔽(hide)全局变量的情形。

>>> name='charlie'

>>> def test():

print(name)

>>> test()

charlie

>>> print(name)

charlie

>>> def test():

print(name)

name='bob'#在这里再定义一个name,name后面会出错

>>> test()

Traceback (most recent call last):

File "", line 1, in

test()

File "", line 2, in test

print(name)

UnboundLocalError: local variable 'name' referenced before assignment #在未被定义就被提及

>>> print(name)

charlie

该错误提示test()中的print(name)的那么还未定义。这正是程序中name='bob'导致的。

python规定在函数内对不存在的变量赋值时,默认就是重新定义新的局部变量。因此这行代码重新定义了那么的局部变量,这样name全局变量就被遮蔽了。

如何便面这种情况?

>>> name='charlie'

>>> def test():

#通过globals()函数访问name全局变量

print(globals()['name'])

name='bob'

>>> test()

charlie

>>> print(name)

charlie

>>> def test():

#通过globals()函数访问name全局变量

print(globals()['name'])

name='bob'

print(name)

>>> test()

charlie

bob

或者

>>> name='charlie'

>>> def test():

global name  #全局声明,声明name是全局变量,后面的赋值语句不会重新定义局部变量

print(name)

name='bob'

print(name)

>>> test()

charlie

bob

>>> name

'bob'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值