Python之旅——全局变量&局部变量

1.全局变量 VS 局部变量

a. 全局变量在整个文件内有效;

b.局部变量在函数内有效;

c.当全局变量和局部变量同名,局部变量有效。

若定义了全局变量,则可在函数内直接使用全局变量。

a = 1
b = [23, 98]

def func():
    print("a = ", a) #使用全局变量
    print("b = ", b)
    b[0] = 9
    print("b = ", b)

func()

输出结果:

a = 1
b = [23, 98]
b = [9, 98]

若在函数内,存在对全局变量重新赋值,在Python中将解析为定义一个变量。


a = 1
b = [23, 98]

def func():
    if(1 == a): #局部变量a定义前使用,语法错误
        a = 2 #局部变量a定义

    print("a = ", a)
    print("b = ", b) #全局变量b
    b[0] = 9
    print("b = ", b)

func()

运行结果:

Traceback (most recent call last):
File "变量.py", line 13, in <module>
func()
File "变量.py", line 5, in func
if(1 == a):
UnboundLocalError: local variable 'a' referenced before assignment

若需使用全局变量,则在函数内使用global关键字声明全局变量即可。

a = 1
b = [23, 98]

def func():
    global a #全局变量
    if(1 == a):
        a = 2

    print("a = ", a)
    print("b = ", b)
    b[0] = 9
    print("b = ", b)

func()

输出结果:

a = 2
b = [23, 98]
b = [9, 98]

若不需要使用全局变量,且和全局变量同名,则需要在函数内对其进行一次定义,再使用局部变量。

a = 1
b = [23, 98]

def func():
    a = 1 #定义局部变量
    if(1 == a): 
    a = 2

    print("a = ", a)
    print("b = ", b)
    b[0] = 9
    print("b = ", b)

func()

从前面的例子可以看出,对全局列表的某一个成员赋值符合语法规则。但是,函数内对与全局列表变量b再次赋值,即表示局部变量的定义。在变量定义之前使用,将会报告错误。

a = 1
b = [23, 98]

def func():
print("a = ", a)
print("b = ", b) #局部变量定义前使用,语法错误
b[0] = 9
print("b = ", b)

if(9 == b[0]):
b = [28, 98] #局部变量定义

print("b = ", b)

func()

输出结果:

a = 1
Traceback (most recent call last):
File "变量.py", line 15, in <module>
func()
File "变量.py", line 6, in func
print("b = ", b)
UnboundLocalError: local variable 'b' referenced before assignment

综上所述:

1. 函数内对与全局变量同名的变量赋值,表示定义一个局部变量。变量必须先定义,后使用。

2. 对于列表类,可以对全局变量列表的一个元素b[0]重新赋值,不表示定义一个局部变量。

建议:

1. 避免定义一个和全局变量同名的局部变量;

2. 函数内使用全局变量,使用global在函数内对其进行声明。

 

 2018年7月21日更新:

此处全局变量和局部变量的问题,其实就是最内嵌套作用域规则。

Python虚拟机在执行Python字节码时,会去搜索变量对象所在的作用域:

a.先从函数内local搜索变量对象;

b.再从全局(即文件内)global搜索变量对象;

c.最后从内建的(builtin)变量对象中搜索。

搜索不到对应的变量对象报告错误。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值