第一篇博客,希望坚持总结、记录的习惯。更希望大佬多多指正以求进步。
python里,可变对象有list,set,dict,即对象id不变但内容可变。
def func(a, l=[]):
l.append(a)
print(l)
# 执行两次
func(1)
func(1)
# 输出应该是
[1]
[1]
执行两次func(1),函数和输入参数一样,输出应该是一样的。如果我们是这样的想法,那就进入了陷阱。实际输出是:
[1]
[1, 1]
第一次执行func()的时候,函数实例化了一个空列表并赋值给l,第二次执行的时候并不会再次实例化一个空列表(希望大佬指点。我的理解是 l=[] 这一句只在编译时执行,因此只执行一次),即l已经存储了上次添加的元素,因此再次添加元素后变成[1, 1]。
解决方法
(1)不使用可变对象作为函数默认参数
(2)解决可变对象问题统一的方法——拷贝,具体实现代码如下
def func(a, l=[]):
lst = copy.copy(l)
# 也可以使用下面这个方法完成拷贝
# lst = list(l)
lst.append(a)
print(lst)