python-模块-模块导入之作用域函数(五)
1.python变量作用域
一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。
每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。
Python 会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。
因此,如果要给函数内的全局变量赋值,必须使用 global 语句。
2.global属性运用
#coding=utf-8; money ="first"; def globaltest(): money = "second"; print "函数内money:",money; print "函数外money:",money; globaltest(); """ 1 当局部变量与全局变量名称相同时,会优先使用局部变量名称 """ nambers =8; def globaltest2(): global nambers; #nambers = nambers+1; nambers = 999; print "函数内nambers:",nambers; print "函数外nambers:",nambers; globaltest2(); """ 2 当全局变量在函数内不能直接被改变 会报:UnboundLocalError: local variable 'nambers' referenced before assignment 需要声明才能使用:globle nambers; """ lst = [2,4]; def globaltest3(): lst=[1,3]; #lst.append(999); """for i in lst: print i;""" print lst; globaltest3(); """ 3 字符串、数字类型是不能被在局部被修改的,除非使用global关键字,但是 列表,字典是可修改,但不能重新 赋值,如果需要重新赋值,需要在函数内部使用global定义全局变量 """ print lst; """列表2""" list = ['bb','cc']; def globaltest4(): global list; list =['aa']; print(list); globaltest4(); print(list);
运行结果如下:
函数外money: first 函数内money: second 函数外nambers: 8 函数内nambers: 999 [1, 3] [2, 4] ['aa'] ['aa']
3.python中global()和locals()比对
3.1 locals()和globals()分别用来返回调用者的局部和全局名称空间的字典。
3.2 在全局名称空间下,globals()和locals()返回相同的字典。
3.3 globals()是可写的,即,可修改该字典中的键值,可新增和删除键值对。
3.4 locals()是不可修改字典中已存在的键值的,也不能pop移除键值对,但是可以新增键值对。
3.1,3.2示例:
#coding=utf-8; x=1; def demo(): global y; y=0; z=3; name="jack"; print "函数内globals:",globals(); print "函数内locals:",locals(); demo(); print "globals外:",globals(); print "locals外:",locals();
运行结果:
函数内globals: {'__builtins__': <module '__builtin__' (built-in)>, 'demo': <function demo at 0x0000000003569588>, '__file__': 'C:/Users/m/PycharmProjects/chengxukongzhi/globalAndLocal.py', '__package__': None, 'x': 1, 'y': 0, '__name__': '__main__', '__doc__': None} 函数内locals: {'z': 3, 'name': 'jack'} globals外: {'__builtins__': <module '__builtin__' (built-in)>, 'demo': <function demo at 0x0000000003569588>, '__file__': 'C:/Users/m/PycharmProjects/chengxukongzhi/globalAndLocal.py', '__package__': None, 'x': 1, 'y': 0, '__name__': '__main__', '__doc__': None} locals外: {'__builtins__': <module '__builtin__' (built-in)>, 'demo': <function demo at 0x0000000003569588>, '__file__': 'C:/Users/m/PycharmProjects/chengxukongzhi/globalAndLocal.py', '__package__': None, 'x': 1, 'y': 0, '__name__': '__main__', '__doc__': None}
3.3,3.4示例:
#coding=utf-8; x=1; def demo(): global y; y=0; z=3; name="jack"; globals()["x"]=11; globals()["y"]=22; locals()["z"]=6; #修改不成功,不能修改 print locals(); print globals(); demo();
运行结果:
{'z': 3, 'name': 'jack'} {'__builtins__': <module '__builtin__' (built-in)>, 'demo': <function demo at 0x00000000038195F8>, '__file__': 'C:/Users/m/PycharmProjects/chengxukongzhi/globalAndLocal.py', '__package__': None, 'x': 11, 'y': 22, '__name__': '__main__', '__doc__': None}