python如何定义带有可变数量参数的函数,python中函数的可变参数
本文主要介绍python函数默认参数的详细解释,请不要定义变量类型,有很好的参考价值,希望对大家有所帮助。如有错误或不足之处,请不吝赐教。
00-1010函数默认参数不定义可变类型和不可变类型定义可变类型有什么问题?问题原因的解决方法:注意变量类型作为默认参数时的测试:用字典替换变量类型列表测试:测试一个不可变的类型字符串:包装一个祖先列表进行汇总。
目录
您经常会看到这样的代码警告:
默认参数值是可变的
这意味着在函数的定义中,变量类型被用作默认参数。
那为什么会有这个警告?
函数的默认参数请勿定义可变类型
可变:列表,字典不可变:数字,字符串,元组
可变类型和不可变类型
def fun(a=[]):
a .追加(1)
打印(一份)
if __name__==__main__:
乐趣()
乐趣()
[1]
[1, 1]
可以发现,在默认参数定义了可变类型之后,当第二次甚至更多次调用同一个函数时,默认参数似乎就失去了作用。
此时,在同一个函数需要重复调用的场景下,就非常容易出问题,而且问题也不容易被察觉。调试时会出现没有传入参数,但函数参数会有值,不该执行的操作会执行。
定义可变类型会有什么问题?
我的理解:
我们定义的函数本身就是函数的实例化对象。每当我们定义一个函数,我们就创建一个函数的实例化对象,默认参数是它的属性。
当没有参数传入时,以默认参数的形式调用,函数对象的属性值发生变化时,保存变化后的属性值。当第二次调用同一个对象时,属性值已经更改。
类型(有趣)
功能
导致的原因
def fun(a=无):
如果a不是:
a=[]
a .追加(1)
打印(一份)
if __name__==__main__:
乐趣()
乐趣()
[1]
[1]
解决方法
请先看看代码,看看代码的输出是不是和你想的一样。
def e(v,l=[]):
l .追加(v)
返回l
l1=e(10)
l2=e(123,[])
l3=e(a )
打印(l1、l2、l3)
# Output: ([10, a],[123],[10, a])
关于上面的代码,标准的解释是,带默认参数的表达式是在定义函数时计算的,而不是在调用函数时计算的。
我觉得通俗的解释就是,当缺省值没有被传递的时候,无论函数被调用多少次,函数体内部总是使用缺省的“L”,而这个缺省的“L”是变量类型,所以它的变化会影响到所有指向它的变量,也就是l1和l3。
为了让以上两点更站得住脚,我进行了以下测试。
关于可变类型作为默认参数时的注意点
def e(k,v,d={}):
d[k]=v
返回d
d1=e(10,10)
d2=e(123,123,{})
d3=e(a , a )
打印(d1、d2、d3)
# Output: ({a : a ,103360 10},{12: 123},{a 3360 a ,103360 10})
测试:将可变类型列表换为字典
def e(v,s=):
s=s v
返回s
S1=e(我)
s2=e(a ,)
S3=e(是)
打印(s1、s2、s3)
#输出:I A is
其实以上几类都已经说明了问题,只是写一篇文章不容易。我决定使用元祖包列表,看看当我修改这个列表中的数据时会发生什么。
其实不需要测试。最终打印的数据必须类似于* *“可变类型时的操作”* *的输出。
为什么?因为我没有修改祖先本身,所以我修改了它的可变类型列表。
不能太过分,否则会得到深抄和浅抄。
测试:来个不可变类型字符串
DEF (V,T=([],)): #用元素传递祖先时记得带逗号。
t[0]。追加(v)
# t=t[0]。append(v)知道t[0]。append(v)没有返回值,t将指向None。如果是这样退的话,所有外印的都是None,不能这样退。
#如果你想要t[0]=t[0]。append(v)也不行。为什么?你在ipython里输入dir(())就知道了。
#嗯,其实是因为元祖可读不可写。它能切片和横移就不错了。
返回t
T1=e (I )
t2=e(a ,([],))
T3=e(“是”)
打印(t1, \n ,t2, \n ,t3)
#输出3360
# ([我,是],)
# ([a],)
# ([我,是],)
测试:元祖包个列表来
家里停电了,我就来网吧了。这篇文章是在网吧写的,用的是python3的在线编辑器,有些地方做了编码(比如命名-。-)如果表达得不好请见谅。
至于那套,我就不测试了。该集合通常用于重复数据删除和关系操作。它是无序的、不可重复的、易变的。
以上个人经验,希望给你一个参考,也希望你能支持盛行的IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。