7_函数_advanced knowledge(局部变量与全局变量、参数(advanced))

7_函数_advanced knowledge(局部变量与全局变量、参数(advanced))
最新回答
丶小嘴灬乱亲

2021-03-02 16:37:49

在Python中,局部变量与全局变量的核心区别在于定义位置和作用域,而参数的高级用法包括默认参数、可变参数(*args和kwargs)及参数传递技巧。以下是具体说明:

一、局部变量与全局变量
  • 局部变量

    定义:在函数内部通过赋值语句创建的变量,仅在函数内部有效。

    特性

    函数内同名局部变量互不影响。例如:

    def test1(): a = 10def test2(): a = 5test1(); test2() # 函数内a独立,无冲突

    函数内赋值默认创建局部变量,即使与全局变量同名。例如:

    a = 10def test(): a = 5 # 局部变量a,不影响全局a print("函数内a:%d" % a) # 输出5test()print("函数外a:%d" % a) # 输出10
  • 全局变量

    定义:在函数外部定义的变量,整个模块内有效。

    特性

    函数内可直接读取全局变量,但修改需用global声明。例如:

    a = 10def test(): global a # 声明修改全局变量 a = 5 print("函数内a:%d" % a) # 输出5test()print("函数外a:%d" % a) # 输出5

    若未声明global,函数内赋值会隐式创建局部变量,导致报错(如尝试修改未声明的全局变量时)。

二、参数的高级用法
  • 默认参数

    定义:为参数指定默认值,调用时可省略。

    规则:默认参数必须位于参数列表末尾,否则报错。例如:

    def printinfo(name, age=35): # 合法 print("Name: %s" % name) print("Age: %s" % age)printinfo("miki") # 输出Name: miki, Age: 35# def printinfo(name, age=35, sex): # 非法!默认参数不在末尾
  • 可变参数

    *args(位置可变参数)

    定义:接收任意数量的位置参数,包装为元组。

    示例

    def sum_num(a, b, *args): result = a + b for temp in args: result += temp return resultprint(sum_num(1, 2, 3)) # 输出6(1+2+3)print(sum_num(1, 2, 3,4,5)) # 输出15(1+2+3+4+5)

    kwargs(关键字可变参数)

    定义:接收任意数量的关键字参数,包装为字典。

    示例

    def sum_num(a, b, *args, kwargs): print(kwargs) # 输出字典,如{'mm': 5, 'nn': 6}sum_num(1, 2, mm=5, nn=6)

    混合使用

    参数顺序需为:普通参数 → *args → kwargs。

    示例

    def sum_num(a, b, *args, kwargs): print(a, b, args, kwargs)sum_num(1, 2, 3, mm=5) # 输出1 2 (3,) {'mm': 5}
  • 传递可变参数(解包)

    定义:通过*和将序列或字典解包为参数。

    示例

    def test(*args, kwargs): print(args, kwargs)args_list = [3, 4]kwargs_dict = {'mm': 5, 'nn': 6}sum_num(1, 2, *args_list, kwargs_dict) # 等价于sum_num(1,2,3,4,mm=5,nn=6)
三、关键注意事项
  1. 全局变量滥用风险:过度使用全局变量可能导致代码耦合度高,建议优先使用局部变量或函数返回值。

  2. 默认参数陷阱:默认参数在函数定义时评估一次,若为可变对象(如列表),可能引发意外行为。例如:

    def append_item(item, lst=[]): # 默认lst为同一列表对象 lst.append(item) return lstprint(append_item(1)) # 输出[1]print(append_item(2)) # 输出[1, 2](非预期)

    修正:使用None作为默认值,并在函数内初始化:

    def append_item(item, lst=None): if lst is None: lst = [] lst.append(item) return lst
  3. 可变参数与关键字参数冲突:若函数同时定义*args和关键字参数(非kwargs),调用时需确保关键字参数在*args之后或通过字典传递。例如:

    # 合法调用sum_num(1, 2, 3, mm=5) # 报错!mm需通过kwargs接收sum_num(1, 2, *(3,), {'mm': 5}) # 合法

通过合理使用局部变量、全局变量及参数的高级特性,可显著提升代码的灵活性和可维护性。