变量在使用之前未定义
由于python变量的动态性,变量在赋值时会自动定义。
与其它语言一样,全局变量在函数中可直接使用,不需特意声明。然而在函数中对一与全局变量同名的变量赋值时,默认创建的,却是一局部变量。这在某些情况上,会使python解析器都出现一些困扰。
a = 123 def function_test(): print a a = 456 print a function_test()
这段代码会报(变量在使用之前未定义)的错误。
若去掉a=456一句,则程序运行正常。
若去掉print a一句,程序运行也正常。
但两句共存,则报错。
原因即在于 print a 自动适用LEGB法则,将a作为全局变量解释,但其之后的a=456却根据原则,重新定义了一个a的局部变量。显然,在function_test函数的同一作用域内,a不可能既为全局又为局部,所以a将作为局部变量来定义。那么位于a=456之前的print a一句,将访问的是一个还不存在的局部变量a,当然会出错。
而根据本人的原意,是要打印和修改全局变量a1的值,所以解决方法是在print a1前面加上一句:global a1
将a1明确声明为全局变量。
a = 123 def function_test(): global a print a a = 456 print a function_test()
运行结果是:
123
456
Global关键字
在Python中使用全局变量,其实,个人认为并不是很明智的选择;但是自己还是坚信,存在便合理,在于你怎么使用;全局变量降低了模块和函数之间的通用性;所以,在以后的编程过程中,应尽量避免使用全局变量。
全局变量的使用:
方法一:
为了便于代码管理,将全局变量统一放到一个模块中,然后在使用全局变量的时候,导入全局变量模块,通过这种方法来进行使用全局变量;
在一个模块中定义全局变量:
- #global.py
- GLOBAL_1 = 1
- GLOBAL_2 = 2
- GLOBAL_3 = ‘Hello World’
然后在一个模块中导入全局变量定义模块,在新模块中使用全局变量:
- import globalValues
- def printGlobal():
- print(globalValues.GLOBAL_1)
- print(globalValues.GLOBAL_3)
- globalValues.GLOBAL_2 += 1 # modify values
- if __name__ == ‘__main__’:
- printGlobal()
- print(globalValues.GLOBAL_2)
方法二:
直接在模块中定义全局变量,然后在函数中直接使用就ok了。但是在使用全局变量的时候,必须在函数中使用global关键字进行标识:
- CONSTANT = 0
- def modifyGlobal():
- global CONSTANT
- print(CONSTANT)
- CONSTANT += 1
- if __name__ == ‘__main__’:
- modifyGlobal()
- print(CONSTANT)
Leave a Reply