全局变量与大发彩局票网站开发haozbbs.comQ1446595067局部变量的本质区别在于作用域:
全局变量是在整个py文件中声明的,全局范围内都能访问;
局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就会崩掉。
如果在函数内部定义某个与全局变量一样名称的局部变量,就可能导致意外的效果,不建议这样使用,这样会使程序不健全。
例1:
def fun(x):
y=2
print("乘法的运行结果:",x*y)
num1=1
print("初始num1=",num1)
fun(num1)
print("y的值是:",y)
运行结果:
初始num1= 1
乘法的运行结果: 2
Traceback (most recent call last):
File "/home/python/Desktop/MX_Dynamic_Query_RTree2/test.py", line 18, in <module>
print("y的值是:",y)
NameError: name ‘y‘ is not defined
原因是:试图访问局部变量,但是访问的地方不在该变量y的作用域中,变量y是在函数内部定义的一个局部变量,所以该变量的作用域为该函数内部,在函数外部访问该局部变量y会报错!
例2:
def fun():
num1 = 2
print("函数内修改后num1=", num1)
num1 = 1
print("初始num1=", num1)
fun()
print("运行完函数后num1=", num1)
运行结果:
初始num1= 1
函数内修改后num1= 2
运行完函数后num1= 1
可以看到在函数内部对全局变量修改后,在函数执行完毕,修改的结果是无效的,全局变量并不会受到影响。
例3:
def fun():
num1 *= 2
print("函数内修改后num1=", num1)
num1 = 1
print("初始num1=", num1)
fun()
print("运行完函数后num1=", num1)
运行结果:
初始num1= 1
Traceback (most recent call last):
File "/home/python/Desktop/MX_Dynamic_Query_RTree2/test.py", line 15, in <module>
fun()
File "/home/python/Desktop/MX_Dynamic_Query_RTree2/test.py", line 11, in fun
num1 *= 2
UnboundLocalError: local variable ‘num1‘ referenced before assignment
报错,这是因为在函数中使用了局部变量num1,它只是个跟全局变量同名的局部变量,使用前还是要赋值。
例4:如果真的想在函数体内修改全局变量的值,可以使用global关键字
def fun():
global num1
num1=2
print("函数内修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("运行完函数后num1=",num1)
运行结果:
初始num1= 1
函数内修改后num1= 2
运行完函数后num1= 2
使用global关键字就是告诉python编辑器,这个变量不是局部变量而是全局变量,其实有点像"引用"的意思。
例5:关键字nonlocal,字面意思是当前这个变量不是局部变量,它是python3.0中新增的关键字,python2.x中不支持。
def fun():
num2 = 3
def fun2():
num2 *= 2
print("num2=", num2)
return fun2()
fun()
报错!!错误的原因跟前面的差不多,就是使用了未定义的局部变量,然而num2也不是全局变量,只是fun2函数的外层变量,强行使用global定义num2的话同样会报错。
加上nonlocal关键字:
def fun():
num2 = 3
def fun2():
nonlocal num2
num2 *= 2
print("num2=", num2)
return fun2()
fun()
运行结果:num2= 6
原文地址:http://blog.51cto.com/13860239/2139404