python-函数之命名空间作用域

第一类对象的概念:
函数名可以赋值
可以作为一个数据结构的元素
可以作为一个函数的参数
可以作为一个函数的返回值
def func():
    print('in func')
    return 10
def func2():
    print('in func2')
    return 20
print(func)
f = func
print(f)
t = func
print(t)
print(t())
print(f())
print(func())
l = [func,func2]
for i in l:
    i()

l = [1,2,3]
t = l
print(t)

def func():
    print('in func')
    return 10

def func2(arg):
    arg()
    return arg

f = func2(func)
f()
函数的名字
namespace 命名空间,名称空间
局部命名空间:每一个函数都拥有自己的命名空间
全局命名空间:写在函数外面的变量名
内置命名空间:python解释器启动之后就可以使用的名字
python的解释器要运行起来
加载顺序:
先所有内置命名空间中的名字-->然后按照顺序加载全局命名空间中的名字
局部命名空间中的名字:在调用函数的时候产生,并且随着调用结束而消失
函数的嵌套定义:
def func():
def qqxing():
print('qqxing')
qqxing()

func()
例题
def func2():
    print('in func2 now')

def func():
    func2()
    n = 20
    print(n)

func()

例题:
def func2():
    print('in func2 now')
    print('多写一行')
    if True:
        print('又多写了一行')
    return 'func2的返回值'

def func():
    ret = func2()
    print(ret)
    n = 20
    print(n)

func()
函数的嵌套调用

作用域:一个名字可以使用的区域
全局作用域:内置名字空间和全局名字空间中的名字都属于全局作用域
局部作用域:局部名字空间中的名字属于局部作用域
局部作用域可以使用全局作用域中的变量
而全局作用域不能使用局部作用域中的变量
局部作用域中还可以嵌套更小的局部作用域
作用域链:小范围作用域可以使用大范围的变量,但作用域链是单向的,不能反向应用

def func():
    a = 10
    b = 20
    print(locals())     #保存了当前作用域中变量
    print(globals())
# n = 10
# m = 22
# print(globals())    #保存了在全局作用域中的名字和值
func()
globals()  保存了在全局作用域中的名字和值
locals() 中的内容会根据执行的位置来决定作用域中的内容
如果在全局执行
globals()和locals打印的结果会是一致的
注意:
小范围可以使用大范围的,但不能修改
如果想要修改,使用global关键字 --尽量避免
如果想要修改最近拥有该变量的外层函数:使用nonlocal ---不影响全局

n = 1
def fun():
    global n
    n = n+1
    return n

fun()
print(n)
如果想要修改,使用global关键字 --尽量避免
例题1:
n = 0
def func():
    n = 1
    def func2():
        nonlocal n
        n+=1
    func2()
    print(n)

func()

例题2:
n = 0
def func():
    n = 1
    def func2():
        n = 2
        def func3():
            nonlocal n
            n+= 1
        func3()
        print(n)
    func2()
    print(n)

func()
print(n)
如果想要修改最近拥有该变量的外层函数:使用nonlocal ---不影响全局

 

 


总结:
函数的嵌套调用和函数的嵌套定义
命名空间:三种:内置命名空间,全局命名空间和局部命名空间
作用域:两种:全局和局部
作用域链:名字的使用是从小范围到大范围的就近事件
globals()和locals()方法
 
 
 
posted @ 2017-11-04 16:23  dwenwen  阅读(115)  评论(0编辑  收藏  举报