Python中默认参数的坑

def extendList(val ,list=[]):
    list.append(val)
    print(id(list))
    return list
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')
print('list1 = %s' % list1)
print('list2 = %s' % list2)
print('list3 = %s' % list3)

输出结果为:

35563600
35563640
35563600
list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']

很多人会以为list1应该等于[10]以及list3应该等于['a']。 认为list的参数会在extendList每次被调用时会被设置成它的默认值[]。

但实际的情况是,新的默认列表仅仅只在函数被定义时创建一次。随后当extendList没有被指定的列表参数调用的时候,其使用的是同一个列表。(通过打印出的list变量地址可看出)

extendList函数的定义可以做如下修改:

def extendList(val ,list=None):
    if list is None:
        list = []
    list.append(val)
    print(id(list))
    return list
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')
print('list1 = %s' % list1)
print('list2 = %s' % list2)
print('list3 = %s' % list3)

输出结果为:

35573312
35573272
35563640
list1 = [10]
list2 = [123]
list3 = ['a']

这个结果可能是我们一开始期望的结果。当没有新的list参数被指定的时候,每次执行函数默认都会新建一个list。

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部