脚本宝典收集整理的这篇文章主要介绍了Python |(基础)函数默认参数必须指向不可变对象,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
测试
Python 默认参数提高了变成效率,但是这里面的坑也是坑死人不偿命,使用稍微不正确,会造成致命的失误
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def test(lang=[]):
lang.apPEnd('python')
return lang
当老实调用时,结果如你所愿
PRint(test(['js','go']))
print(test(['c','java']))
结果如下
['js', 'go', 'python']
['c', 'java', 'python']
[Finished in 0.1s]
但是如果多次使用默认参数调用时,奇迹出现了
print(test())
print(test())
结果如下:
['python']
['python', 'python']
[Finished in 0.1s]
或许有人对此感到很困惑,为什么默认参数会记住更新过的默认参数
分析:
函数在定义的时候,默认参数lang
的值就已经声明了,即空的 []
,也就是说 默认参数
指向对象 []
,在多次调用默认参数的情况下,就改变了默认参数
指向对象的数据,默认参数
指向对象的数据变了,下次再调用时,默认参数已经变了,即不再是你希望的空的[]
为了便于理解等同下面这段:
temp = []
def test(lang=temp):
lang.append('python')
return lang
这样就好看多了,多次调用时,temp
也在不断的变化
注意函数默认参数和函数中的参数的上下文环境
结论
定义函数默认参数时,函数默认参数必须指向不变对象,建议使用 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]
以上是脚本宝典为你收集整理的Python |(基础)函数默认参数必须指向不可变对象全部内容,希望文章能够帮你解决Python |(基础)函数默认参数必须指向不可变对象所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。