python中可选参数_正确使⽤Python可选参数
函数的带默认值参数能够很⼤程度上⽅便我们使⽤:⼀般情况下可以省略传参使⽤参数的默认值,也可以主动传参;调⽤的时候也不⽤在意参数的顺序⽅便使⽤,并且直接、显式;甚⾄还能⽤来当作魔法值,做⼀些逻辑上的控制。
但是由于python的默认值参数只会在函数定义处被解析⼀次,此后每次调⽤函数的时候,默认值参数都会是这个值了。碰到⼀些不可变的数据类型⽐如:整型,字符串,元祖之类的还好,但如果碰到可变类型的数据⽐如数组的话,就会有发⽣⼀些意想不到的事情。
让我们举⼀个简单的例⼦说明⼀下:
def add_to(num, target=[]):
target.append(num)
print id(target), target
add_to(1)
# Output: 39003656, [1]
add_to(2)
# Output: 39003656, [1, 2]
add_to(3)
# Output: 39003656, [1, 2, 3]
很显然如果你是想每次调⽤函数都能得到⼀个新的包含期望结果的数组,肯定不能如愿了。函数add_to的参数target在函数第⼀次被解析的时候会被赋值成空的数组,因为只会被解析⼀次,以后每次调⽤的时候都会在这个target变量的基础上进⾏操作,变量的id值也完全⼀样。想要得到预期的结果,可以为这种可变数据类型的参数指定⼀个None来表⽰空值:
def add_to(num, target=None):
if target is None:
target = []
...
在python的世界⾥,参数是按标识符传递(粗暴点解释就是按引⽤传递的),你需要担⼼的是参数的类型是否是可变的:
>>> def test(param1, param2):
... print id(param1), id(param2)
python 定义数组... param1 += 1
... param2 += 1
... print id(param1), id(param2)
...
>>> var1 = 1
>>> var2 = 2
>>> print id(var1), id(var2)
36862728 36862704
>>> test(var1, var2)
36862728 36862704
36862704 36862680
可变的数据类型,函数局部作⽤域⾥⾯的任何改变会保留在数据上;不可变的数据类型,发⽣的任何改变都只会体现在新⽣成的局部变量上,如同上⾯的列⼦中所⽰的效果,读者可以对⽐⼀下。
参考资料:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论