python函数对象以及名称空间和作用域

函数对象

python中一切皆对象

s=10
print(s)

1.引用

s1=s

2.容器元素

lt=[s]

3.作为函数的实参

def f1(s):
	print(s)

4.作为函数的返回值

def f1(s):
    return s

字典/列表/元组/集合/布尔值,所有对象都可以做以上四件事

函数对象==函数名 函数名()就是在调用,没有其他意思

函数嵌套

函数里面有函数

def f1():
    print('from f1')
    def f2():
        print('from f2')
res=f1()

函数内部定义的函数,外部就不能用

名称空间和作用域

变量名/函数名--》名称--》名称空间:专门存储名称的

内置名称空间:存储了内置方法的名称

数据类型自带内置方法;python解释器自带内置方法(print/len/list/str/dict)

全局名称空间:除了内置和局部都叫全局

局部名称空间:函数内部定义的都叫局部

名称空间的执行(生成)循序:

1.内置名称空间:python解释器启动的时候就有了

2.全局名称空间:执行文件代码的时候才会有全局

3.局部名称空间:函数调用的时候才会有局部

搜索顺序

先从当前所在位置寻找,找不到再按找这种循序,不会逆着方向寻找

局部——》全局——》内置——》报错

作用域

全局作用域:内置名称空间+全局名称空间——》全局作用域

1.全局作用域的x和局部作用域的x没有半毛钱关系

局部作用域:局部名称空间——》局部名称空间

2.局部作用域1的x和局部作用域2的x也没有任何关系,即使局部作用域1和局部作用域2在同一个局部作用域下

global

x = 10
def f1():
    global x  # 让global以下的局部的x变成全局的x    
    x = 20
f1()
print(x)

nonlocal

x = 10
def f1():
    def f2():
        def f3():
            nonlocal x  # nonlocal让x成为顶层函数的局部,不是让他成为全局  # 压根没有应用情景,尽量不要嵌套函数
            x = 1
         x = 2
         f3()
         print(1, x)
     f2()
f1()
print(2,x)
def f0():
    x  = 3  # f1的nonlocal无法修改
    f1()

所有可变数据类型均可打破上述一切规则

lt = [10]
def f1():
    lt.append(12)
    lt[0] = 11
f1()
print(lt)
posted @ 2020-03-26 22:27  风啊风啊  阅读(400)  评论(0编辑  收藏  举报