命名空间和变量作用域

变量作用域: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

 

 

posted @ 2013-02-28 13:50  道以万计  阅读(1105)  评论(0编辑  收藏  举报