有关一个在函数参数设置缺省值与引用的问题,这个问题是大多数Pythoner可能会忽视的问题,作个笔记,以备后阅,同时供需要的朋友参考
代码如下:
importrandom,string
classC(object):pass
defdangerFunction(msg,l=[],b={},c=C()):
printmsg,'-'*10
printl,b,c.__dict__
l.append(1)
b[random.choice(string.ascii_lowercase)]=''
c.__dict__[random.choice(string.ascii_lowercase)]=""
printl,b,c.__dict__
dangerFunction('1')
dangerFunction('2')
dangerFunction('3')
print'-'*20
defsafeFunction(msg,l=None,b=None,c=None):
ifnotl:l=[]
ifnotb:b={}
ifnotc:c=C()
printmsg,'-'*10
printl,b,c.__dict__
l.append(1)
b[random.choice(string.ascii_lowercase)]=''
c.__dict__[random.choice(string.ascii_lowercase)]=""
printl,b,c.__dict__
safeFunction('1')
safeFunction('2')
safeFunction('3')运行结果:
代码如下:
1----------
[]{}{}
[1]{'q':''}{'p':''}
2----------
[1]{'q':''}{'p':''}
[1,1]{'q':'','a':''}{'p':'','g':''}
3----------
[1,1]{'q':'','a':''}{'p':'','g':''}
[1,1,1]{'q':'','a':'','w':''}{'p':'','w':'','g':''}
--------------------
1----------
[]{}{}
[1]{'k':''}{'l':''}
2----------
[]{}{}
[1]{'r':''}{'c':''}
3----------
[]{}{}
[1]{'q':''}{'h':''}由dangerFunction打印出来的结果来看,缺省值为[],(),class
再下次调用时,如果继续参数空缺而使用缺省值,那么缺省值延续上次引用。可能打印无任何标志无法看清楚,加上文字应该会简单很多。
代码如下:
#-*-coding:utf-8-*-
importrandom,string
classC(object):pass
defdangerFunction(msg,l=[],b={},c=C()):
printmsg,'-'*10
printu'操作前',l,b,c.__dict__
l.append(1)
b[random.choice(string.ascii_lowercase)]=''
c.__dict__[random.choice(string.ascii_lowercase)]=""
printu'操作后',l,b,c.__dict__
dangerFunction('1')
dangerFunction('2')
dangerFunction('3')
print'-'*10,u'我是分隔符','-'*10
defsafeFunction(msg,l=None,b=None,c=None):
ifnotl:l=[]
ifnotb:b={}
ifnotc:c=C()
printmsg,'-'*10
printu'操作前',l,b,c.__dict__
l.append(1)
b[random.choice(string.ascii_lowercase)]=''
c.__dict__[random.choice(string.ascii_lowercase)]=""
printu'操作后',l,b,c.__dict__
safeFunction('1')
safeFunction('2')
safeFunction('3')代码如下:
1----------
操作前[]{}{}
操作后[1]{'m':''}{'v':''}
2----------
操作前[1]{'m':''}{'v':''}
操作后[1,1]{'i':'','m':''}{'g':'','v':''}
3----------
操作前[1,1]{'i':'','m':''}{'g':'','v':''}
操作后[1,1,1]{'i':'','s':'','m':''}{'s':'','g':'','v':''}
----------我是分隔符----------
1----------
操作前[]{}{}
操作后[1]{'e':''}{'q':''}
2----------
操作前[]{}{}
操作后[1]{'d':''}{'s':''}
3----------
操作前[]{}{}
操作后[1]{'m':''}{'k':''}
更多信息请查看IT技术专栏