python成长之路七-函数的进阶

1,python中,名称空间分三种:

  1. 全局命名空间

  2. 局部命名空间(临时命名空间)

  3. 内置名称空间

 

2,作用域(两种):

   1,全局作用域  包含:全局名称空间   内置名称空间

   2,局部作用域  包含:局部命名空间

 

  2.1,取值顺序:

    就近原则:局部名称空间 --> 全局名称空间 --> 内置名称空间   单向从小到大范围

  2.2, 加载顺序:

    内置名称空间 --> 全局名称空间(当程序执行时) -- > 局部名称空间(当函数调用的时候)

3,函数的嵌套:

  

def func1():
    print(111)
def func2():
    print(222)
    func1()
    print(333)
print(666)
func2()
print(555)
例子1
def func1():
    print(222)
    def func2():
        print(333)
    print(111)
    func2()
    print(666)
func1()

# 执行结果:
222 111 333 666
例子2

4,global   nonlocal

  局部名称空间对全局名称空间的变量可以引用,但是不能改变。

count = 1
def func1():
    count = 2
    print(count)
func1()
count = 1
def func1():
    # count = 3
    count = count + 1  # local variable 'count' referenced before assignment
    print(count)
func1()
报错

报错原因: 如果你在局部名称空间 对一个变量进行修改,那么解释器会认为你的这个变量在局部中已经定义了,但是对于上面的例题,局部中没有定义,所以他会报错,

  global

    1,在局部名称空间声明一个全局变量。

声明

    2,在局部名称空间声明可以对全局变量进行修改。

count = 1
def func1():
    global count
    count = count + 1
    print(count)
func1()
print(count)
修改

  nonlocal

    1,子函数对父函数的变量进行修改。

    2,此变量不能是全局变量

    3,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

def func1():
    count = 666
    def inner():
        print(count)
        def func2():
            nonlocal count
            count += 1
            print("func2",count)
        func2()
        print("inner",count)
    inner()
    print("funcl",count)
func1()

# 运行结果:
666
func2 667
inner 667
funcl 667
global

  

猜你喜欢

转载自www.cnblogs.com/peng104/p/9488414.html