《Python》 函数进阶和名称空间作用域

函数进阶:

一、动态参数:*args  **kwargs

  *args是元祖形式,接收除去键值对以外的所有参数  # args可以换成任意变量名,约定俗成用args

  **kwargs接收的只是键值对的参数,并保存在字典中。  # kwargs可以换成任意变量名,约定俗成用kwargs

  *的魔性用法:

    l1 = [1,2,3]

    l2 = ['alex','taibai']

    def func1(*args):

      print(args)  # 结果:('1','2','3','alex','taibai')

    func1(*l1,*l2)

  在函数的定义时,*位置参数聚合,**关键字参数聚合。

  在函数的调用(执行)时,*位置参数打散(把列表打散成一个个元素),**关键字参数打散(把字典打散成一个个键值对)。

二、名称空间和作用域

  1、名称空间分为三种:存放名字与值的关系的空间

    全局名称空间:代码在运行伊始,创建的存储“变量名与值的关系”的空间

    局部名称空间:在函数的运行中开辟的临时的空间

    内置名称空间:python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法

  2、三种命名空间的加载和取值顺序:

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

    取值顺序:    就近原则

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

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

  3、作用域:

    全局作用域:包含内置名称空间,全局名称空间,整个文件的任意位置都能被引用,全局有效

    局部作用域:局部名称空间,只能在局部范围内有效

  4、关键字  global和nonlocal

    global:

      1、声明一个全局变量

      2、在局部作用域想要对全局作用域的全局变量进行修改时,需要用到global(限于字符串,数字)

def func():
    global a
    a = 3
func()
print(a)


count = 1
def search():
    global count
    count = 2
search()
print(count)

global关键字举例

      ps:对可变数据类型(list,dict,set)可以直接引用不用通过global。

li = [1,2,3]
dic = {'a':'b'}

def change():
    li.append('a')
    dic['q'] = 'g'
    print(dic)
    print(li)
change()
print(li)
print(dic)

对于可变数据类型的应用举例

    nonlocal:

      1、不能修改全局变量

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

def add_b():
    b = 42
    def do_global():
        b = 10
        print(b)
        def dd_nonlocal():
            nonlocal b
            b = b + 20
            print(b)
        dd_nonlocal()
        print(b)
    do_global()
    print(b)
add_b()

nonlocal关键字举例
View Code
原文地址:https://www.cnblogs.com/yzh2857/p/9493782.html