函数 命名空间以及作用域

---恢复内容开始---

命名空间  (namespace  名称空间)

每一个函数,变量都拥有自己的命名空间

内置命名空间

  python解释器启动后就可以使用的名字

全局命名空间

  写在函数外面的变量名

局部命名空间

  调用函数后函数开辟的命名空间

三种命名空间的加载与取值顺序

加载顺序:内置命名空间(程序运行前加载)>全局命名空间(程序运行中从上到下)>局部命名空间(程序运行中调用时才加载)

取值顺序:

  在局部调用:局部命名空间>全局命名空间>内置命名空间

  在全局调用:全局命名空间>内置命名空间

作用域:一个名字可以使用的区域

全局作用域:

  内置命名空间和全局命名空间中的名字都属于全局作用域

局部作用域:

  局部命名空间的名字属于局部作用域

局部作用域可以使用全局作用域中的变量

而全局作用域不能使用局部作用域中的变量

n = 10
def func():
    m = n+1
    print(m)
print(n)#10
print(m)#报错

 

局部作用域还可嵌套更小的局部作用域

函数嵌套的调用
def func2() #  1
    print("in func2 now") #5

def func(): #  2
    func2() # 4
    n=20 # 6
    print(n) # 7

func() # 3

in func2 now
20
def func(): #1
    def func1():#3
        print("我是谁")#5
    func1()#4

func() #2

我是谁

函数嵌套的定义
n = 10
def func():
    n=9
    def func1():
        n=8
        def func2():
            m = n+1#会调用最近的变量
            print(m)
        func2()
    func1()
func()
9

 

作用域链

  小范围作用域可以使用大范围的变量,但作用域链是单向的,不能反向应用

  小范围虽然可以使用大范围的,却不能修改

    如果想要修改全局的:使用global关键字 ——尽量避免

    如果想要修改外层函数的:使用nonlocal——不影响全局

 

n = 1
def func():
    n=n+1
func()
print(n)#会报错,局部变量不能修改全局变量


n = 1
def func():
    global n
    n=n+1

func()
print(n)#打印2
#通过global()关键字可以让局部作用域修改全局作用域

 

n = 1
def func():
    n=3
    def func1():
        n =2
        def func2():
            global n#修改全局变量
            n=n+1
            print(n)#2
        func2()
    func1()

func()
print(n)#2


n = 1
def func():
    n=3
    def func1():
        n =2
        def func2():
            nonlocal n#修改最近函数中的变量
            n=n+1
            print(n)#3
        func2()
        print(n)#3
    func1()

func()
print(n)#1

 

 globals和locals方法

globals()  保存了在全局作用域中的名字和值

locals()  保存了执行的位置的作用域中的名字和值

如果在全局执行globals()和locals()打印的结果是一致的

第一类对象

  可以赋值

  可以作为一个数据结构的元素

  可以作为一个函数的参数

  可以作为一个函数的返回值

posted @ 2017-11-01 19:00  瓜田月夜  阅读(55)  评论(0)    收藏  举报