python默认参数必须指向不变对象

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

你可能感兴趣的:(python数据分析)