赞
踩
使用Python编程的时候,要注意函数内可以访问全局变量,但不能更新(修改)其值。
比如:
a = 10
def sum ( n ) :
n += a
print ('a = ', a, end = ' , ' )
print ( 'n = ', n )
sum(3)
输出:
a = 10 , n = 13
如果引用了还没更新的值则会报错 。比如函数内部调用了全局变量,但之后又修改了该变量,则会引发 UnboundLocalError错误。
a = 10
def sum ( n ) :
n += a # 调用了全局变量a,但是之后又修改了a,引发错误
a = 11 # 修改了全局变量
print ('a = ', a, end = ' , ' )
print ( 'n = ', n )
sum(3)
输出:
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-71-0359ebe4354d> in <module>()
6 print ( 'n = ', n )
7
----> 8 sum(3)
<ipython-input-71-0359ebe4354d> in sum(n)
1 a = 10
2 def sum ( n ) :
----> 3 n += a
4 a = 11
5 print ('a = ', a, end = ' , ' )
UnboundLocalError: local variable 'a' referenced before assignment
a = 10
def sum ( n ) :
a = 11
n += a
print ('a = ', a, end = ' , ' )
print ( 'n = ', n )
sum(3)
print ( '外 a = ', a )
输出:
a = 11 , n = 14
外 a = 10
a = 10
def sum ( n ) :
global a
n += a
a = 11
print ('a = ', a, end = ' , ' )
print ( 'n = ', n )
sum ( 3 )
print ( '外 a = ', a )
输出:
a = 11 , n = 13
外 a = 11
为什么加上 global就可以了呢?首先认识一下global。
global关键字可以定义一个变量,被定义的变量可以在变量作用域之外被修改,通俗讲就是一个全局的变量,这个全局的变量在其被定义后,可以在全部上文中修改和使用。当然,global的使用也有一些自己的规则,当我们在函数内部创建一个变量的时候,如果我们想让他变成一个全局变量,我们需要使用关键字global定义它,但是如果我们是在函数外面定义的变量,那么默认就是global的变量,不用再使用global关键字定义。
举个例子。
x = 100 #全局变量
def func_x():
x = x + 1
print(x)
func_x()
输出:
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-68-d07410756037> in <module>()
5 print(x)
6
----> 7 func_x()
<ipython-input-68-d07410756037> in func_x()
2
3 def func_x():
----> 4 x = x + 1
5 print(x)
6
UnboundLocalError: local variable 'x' referenced before assignment
分析
在这个例子中设置的 x=100 属于全局变量,而在函数内部中没有对 x 的定义。
根据 Python 访问局部变量和全局变量的规则:当搜索一个变量的时候,Python 先从局部作用域开始搜索,如果在局部作用域没有找到该变量,那么 Python 就会在更外一层作用域范围寻找。最终在全局变量中找这个变量,如果找不到则抛出 UnboundLocalError 异常。
但本案例明明已经在全局变量中找到同名变量了,怎么还是报错?
因为,如果内部函数引用了外部函数的同名变量或者全局变量,并且对这个变量有修改的话,那么此时 Python 会认为它是一个局部变量,而函数中并没有 x 的定义和赋值,所以报错。
global 关键字就是专门用来解决此问题,在函数 func_x中,global x会告诉解释器 x 为全局变量,然后会在函数外面寻找 x 的定义,执行完 x = x + 1 后,x 依然是全局变量。
x = 100 #全局变量
def func_x():
global x
x = x + 1
print(x)
func_x()
print('外 x = ', x )
输出:
101
外 x = 101
另外需要注意的是,global 关键字会跳过中间层直接将嵌套作用域内的局部变量变为全局变量。
测试如下:
num = 20
def outer():
num = 10
def inner():
global num
print("第1个num:",num)
num = 100
print("第2个num:",num)
inner()
print("第3个num:",num)
outer()
print('外 num = ', num )
输出:
第1个num: 20
第2个num: 100
第3个num: 10
外 num = 100
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。