Python可变默认参数行为疑问:为何list1运行结果前后不同?
Python可变默认参数的行为陷阱解释
先看你提供的代码:
def check(val, list=[]): list.append(val) return list list1=check("a") list2=check("b",[]) list3=check("c")
出现这种差异的核心原因是Python函数的可变默认参数只会初始化一次:
- 当函数
check被定义时,默认参数list=[]就已经创建了一个空列表对象,这个对象会一直存在,直到函数被销毁。 - 第一次调用
check("a")时,没有传入list参数,所以使用这个预先创建的默认列表,往里面添加"a",此时list1指向的就是这个默认列表,值为["a"]。 - 调用
check("b", [])时,手动传入了一个新的空列表,这次操作的是你传入的新列表,和默认列表完全无关,所以list2的值是["b"]。 - 第三次调用
check("c")时,再次使用那个已经被修改过的默认列表,往里面添加"c",此时默认列表变成了["a", "c"]。而list1始终指向这个默认列表,所以最后查看list1时,它的值就变成了['a','c']。
单独运行list1=check("a")时,默认列表只被修改了一次,所以list1显示["a"];但三个调用放在一起运行时,第三次调用修改了同一个默认列表,list1作为该列表的引用,自然会同步显示更新后的内容。
内容的提问来源于stack exchange,提问作者Anonamous
相关产品推荐
相关产品推荐

