1、一般情况下的默认参数
# coding=utf-8
def enroll(name, age, city="DaLi", country="China"):
print("name:",name)
print("age:",age)
print("city:",city)
if __name__== '__main__':
enroll('c',6,'KunMing')
运行结果:
(‘name:’, ‘c’)
(‘age:’, 6)
(‘city:’, ‘KunMing’)
2、假如默认参数指向了某个可变对象
# coding=utf-8
def add_end(L=[]): #[]是个列表呀
L.append("END")
return L
if __name__== '__main__':
l=add_end()
print(l)
l = add_end()
print(l)
l = add_end()
print(l)
运行结果:
[‘END’]
[‘END’, ‘END’]
[‘END’, ‘END’, ‘END’]
第二次调用的时候,不再是[‘END’],第三次也是。
原因:函数定义时,默认参数L的地址就已经确定,L是可变对象List,每次调用该函数时,如果改变了L的内容,则下次调用的时候,默认参数的内容就会改变。??谁能一句简单话说清????
list 、dict、set都是可变对象。(可变对象是指对象的内存值可以被改变,变量改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的内存地址,通俗说,就是原地改变。)
所以,python默认参数必须指向不可变对象!!
3、怎么办,不想变?用None,让默认参数指向None
None是一个特殊的空值常量
# coding=utf-8
def add_end(L=None):
#L在此时不是List哦 默认参数L,指向的是不变对象None
if(L is None):
L=[]
L.append('END')
return L
if __name__== '__main__':
L=add_end()
print(L)
L = add_end()
print(L)
L = add_end()
print(L)
运行结果:
[‘END’]
[‘END’]
[‘END’]
python各种参数
看这篇,超棒
https://blog.csdn.net/u012005313/article/details/48156887