#! /usr/bin/env python # encoding:utf-8 import os def extendlist(val,list=[]): list.append(val) return list if __name__ == '__main__': list1 = extendlist(10) list2 = extendlist(123,[]) list3 = extendlist('a') print(list1) #[10, 'a'] print(list2) #[123] print(list3) #[10, 'a'] ''' 为什么结果不是这个? [10] [123] ['a'] '''
list2 = extendlist(123,[])是函数的列表参数list指向了空列表对象,你去掉后面的[]就可以了
python 的默认参数 只赋值一次,所以别用数组之类的引用类型.
This inspection detects when a mutable value as list or dictionary is detected in a default value for an argument. Default argument values are evaluated only once at function definition time, which means that modifying the default value of the argument will affect all subsequent calls of the function.
官方解释.
你试试打印id(list1)和id(list3),是同一个地址
id(list2)是另一个地址,list1和list3使用的都是默认的那个列表,list2返回的是你传进去的那个列表.虽然都是空列表,但实际是两个空列表.
不可能出现
[10]
[123]
['a']
若你改变打印位置,顶多只能出现
[10]
[123]
[10, 'a']
为什么list1和list3会用同一个空列表,不应该各自使用各自默认的空列表么?list1/2/3各自都是空列表,我理解的是三个空列表,所以list1/2/3之间没有关系,实际上呢,list1和list3联系上了,就没明白他俩是怎么关联上的,是Python 的默认吗
@xqn2017: 长蘑菇星人回答了,默认参数只赋值一次.你看看官方解释那段英文.
很多教程上会说默认参数不能用可变类型.