Python 默认参数提升了变成效率,可是这里面的坑也是坑死人不偿命,使用稍微不正确,会形成致命的失误java
#!/usr/bin/env python # -*- coding: utf-8 -*- def test(lang=[]): lang.append('python') return lang
当老实调用时,结果如你所愿python
print(test(['js','go'])) print(test(['c','java']))
结果以下app
['js', 'go', 'python'] ['c', 'java', 'python'] [Finished in 0.1s]
可是若是屡次使用默认参数调用时,奇迹出现了函数
print(test()) print(test())
结果以下:测试
['python'] ['python', 'python'] [Finished in 0.1s]
或许有人对此感到很困惑,为何默认参数会记住更新过的默认参数code
分析:
函数在定义的时候,默认参数lang
的值就已经声明了,即空的 []
,也就是说 默认参数
指向对象 []
,在屡次调用默认参数的状况下,就改变了默认参数
指向对象的数据,默认参数
指向对象的数据变了,下次再调用时,默认参数已经变了,即再也不是你但愿的空的[]
对象
为了便于理解等同下面这段:utf-8
temp = [] def test(lang=temp): lang.append('python') return lang
这样就好看多了,屡次调用时,temp
也在不断的变化test
注意函数默认参数和函数中的参数的上下文环境效率
定义函数默认参数时,函数默认参数必须指向不变对象,建议使用 None,str 这些不可变对象处理
从新修改代码
#!/usr/bin/env python # -*- coding: utf-8 -*- def test(lang=None): if lang is None: lang = [] lang.append('python') return lang
调用
print(test()) print(test())
结果:
['python'] ['python'] [Finished in 0.2s]