没有理由期望您的两个函数做同样的事情,更不用说具有相同的性能特征了。
def test_function(A = value()):
#rest of function....
此函数没有“关键字参数”;没有这样的事情。它有一个带有默认值的参数。任何函数的任何参数(除了一些顽固的内置函数)都可以通过关键字或位置传递,但参数本质上不是“关键字参数”。
关键字参数和默认值之间的唯一关联是,当您有多个带有默认值的参数时,在接受较早参数的默认值的同时为后面的参数提供显式值的唯一方法是通过关键字传递后面的参数。
这两个函数之间的巨大区别在于,当您为 声明默认值时A
,它是默认值,而不是在未提供显式值时每次都会重新生成该值的代码。当你这样说时:
def test_function(A = value()):
#rest of function....
您正在为. A
与任何其他上下文一样,当您提供 Python 需要值的复杂表达式时,Python 将评估该表达式,然后使用结果值。因此,当您在函数定义时为 设置默认值A
时,它会被设置为value()
当时返回的任何值。那么这个单一的值就是 的默认值A
。
def test_function():
A = value()
#rest of function ...
在此函数中,value()
每次调用该函数时都会对其进行评估。因此,如果value()
价格昂贵,那么此版本将比第一个版本花费更长的时间。但是如果value()
返回一个你稍后改变的对象,那么默认参数版本将始终使用一个对象,无论它在调用函数时处于什么状态,而第二个版本将value
每次都构造一个新对象. 您使用哪个版本应该由您希望程序具有的语义决定。