命名空间和变量作用域
变量作用域:LEGB
L: local
E: enclosing function locals
G: global
B: built-in
1。 内嵌的模块是全局作用域:顶层命名空间
2。 全局作用域的范围只限于单个文件
3。 每次对函数的调用都创建了一个新的本地作用域
4。 所有的变量名都可以归为 本地、全局、内置
def func1(param=None): def func2(param2=param): if not param2: param2 = 'default' print param2 # Just return func2. return func2 func1()() #=> default func1('winter')() #=> winter
一、对于全局普通变量作为函数default值,def 函数参数解析是按语句先后执行的(静态)
1.正常情况, 结果是打印出 name
flag = True def func(name, flg=flag): if flg: print name func('name')
2. 结果打印:flag= False 并且打印出name, 与预期不符。
#!/usr/local/bin/python2.7 # encoding: utf-8 flag = True def func(name, flg=flag): if flg: print name flag = False # 此语句没有发生预期作用 print 'flag=', flag func('name')
3. 推荐写法, 都可以达到预期目的。第一个打印name, 第二个没有打印。
flag = True def func(name, flg=False): if flg: print name func('name', flag)
flag = True def func(name, flg=False): if flg: print name flag = False func('name', flag)
flag = True def func(name): if flag: print name flag = False func('say name')
二、list 遵循global规则
1. 在func内,可以使用,但不可以改变值。
2. 要改变值,请加global关键字, 或者return
_list = ['a', 'b'] def func(): #print _list #此语句会报错:在定义前使用 _list = ['jfie', 'dfj', '1'] return ['aa', 'bb'] _list = func() print _list #结果:['aa', 'bb']
三、函数无法看到其它函数内的变量名,除非在物理上处于这个函数内。模块也是一样。
物理上:用global映射,用import导入等
四、命名空间嵌套
module1.py X = 1 module2.py X=2 import module1 print X #=> 2 print module1.X #=> 1 module3.py import module2 X=3 print X #=> 3 print module2.X #=> 2 print module2.module1.X #=>1 # 命名空间嵌套:在module3.py 中, import 语句 建立命名空间module2, 在module2命名空间内建立module1