函数的列表作为默认参数

函数的列表作为默认参数带来的问题

#_*_ encoding: utf-8 _*_   @author: ty  hery   2019/9/5

def extendList(val, list=[]):
    print('这个是开始之前列表: ',list)
    list.append(val)
    print(f'这个是append({val})之后的列表当前的列表: ',list)
    return list
list1 = extendList('b')
print ("第一次: list1 = %s, id(list1)=%s" % (list1,id(list1)))

list2 = extendList(123)
print ("第一次: list2 = %s, id(list2)=%s" % (list2,id(list2)))

list3 = extendList('a')
print ("第一次: list3 = %s, id(list3)=%s" % (list3,id(list3)))

list4= extendList(124,[])
print ("第一次: list4 = %s, id(list4)=%s" % (list4,id(list4)))

list5= extendList(124,[5,6])
print ("第一次: list5 = %s, id(list5)=%s" % (list5,id(list5)))

print ("list1 = %s, id(list1)=%s" % (list1,id(list1)))
print ("list2 = %s, id(list2)=%s" % (list2,id(list2)))
print ("list3 = %s, id(list3)=%s" % (list3,id(list3)))
print ("list4 = %s, id(list4)=%s" % (list4,id(list4)))
print ("list5 = %s, id(list5)=%s" % (list5,id(list5)))
输出: 这个是开始之前列表:  []
这个是append(b)之后的列表当前的列表:  ['b']
第一次: list1 = ['b'], id(list1)=167821448
这个是开始之前列表:  ['b']
这个是append(123)之后的列表当前的列表:  ['b', 123]
第一次: list2 = ['b', 123], id(list2)=167821448
这个是开始之前列表:  ['b', 123]
这个是append(a)之后的列表当前的列表:  ['b', 123, 'a']
第一次: list3 = ['b', 123, 'a'], id(list3)=167821448
这个是开始之前列表:  []
这个是append(124)之后的列表当前的列表:  [124]
第一次: list4 = [124], id(list4)=167823688
这个是开始之前列表:  [5, 6]
这个是append(124)之后的列表当前的列表:  [5, 6, 124]
第一次: list5 = [5, 6, 124], id(list5)=167845256
list1 = ['b', 123, 'a'], id(list1)=167821448
list2 = ['b', 123, 'a'], id(list2)=167821448
list3 = ['b', 123, 'a'], id(list3)=167821448
list4 = [124], id(list4)=167823688
list5 = [5, 6, 124], id(list5)=167845256

'''许多人会错误的认为 list1 应该等于 [10] 以及 list3 应该等于 ['a']。认为 list 的参数会在 extendList 每次被调
用的时候会被设置成它的默认值 []。
尽管如此,实际发生的事情是,新的默认列表仅仅只在函数被定义时创建一次。随后当 extendList 没有被指定
的列表参数调用的时候,其使用的是同一个列表。这就是为什么当函数被定义的时候,表达式是用默认参数被
计算,而不是它被调用的时候。
https://www.cnblogs.com/xuchunlin/p/6049371.html 5/61
因此,list1 和 list3 是操作的相同的列表。而 ````list2是操作的它创建的独立的列表(通过传递它自己的空列表
作为list``` 参数的值)。
extendList 函数的定义可以做如下修改,但,当没有新的 list 参数被指定的时候,会总是开始一个新列表,这
更加可能是一直期望的行为。'''

修改策略

def extendList(val, list=None):
    if list is None:
        list = []
        list.append(val)
    return list

list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')
print ("list1 = %s" % list1)
print ("list2 = %s" % list2)
print ("list3 = %s" % list3)
输出:
list1 = [10]
list2 = []
list3 = ['a']
posted @ 2021-04-10 22:49  ty1539  阅读(95)  评论(0编辑  收藏  举报