Python编程整理:函数中默认形参可能被调用函数更改

出现数据串流、错误更改的代码如下:

def func(a, b, list1=[]):
    list1.append(b)
    print(a, b, list1)


func(1, 2)
func(1, 3)
func(1, 4)

# 1 2 [2]
# 1 3 [2, 3]
# 1 4 [2, 3, 4]

我们会发现,三个func函数的调用都没有传入list1的实参。但是三次函数都没有初始化list1位空列表,而是直接把上次调用函数后的list1拿来用。

原因是,

***

默认形参只在函数定义阶段被赋值一次,拿到一个内存地址

***

因为,只有在函数定义阶段默认参数才被赋值一次,那么当这个默认值为可变变量,之后对这个可变变量的操作将会在同一地址上进行。由此,每一次调用函数都会更改这个参数的值,而达不到默认参数的作用。

 

解决方法如下:

def func(a, b, list1=None):
    if list1 is None:
        list1 = []
    list1.append(b)
    print(a, b, list1)


func(1, 2)
func(1, 3)
func(1, 4)

# 1 2 [2]
# 1 3 [3]
# 1 4 [4]

 

建议函数默认参数尽量使用None或者不可变类型作为默认值。

posted @ 2020-08-02 00:32  cutomorrow  阅读(440)  评论(0)    收藏  举报