伙计们,我最近刚开始使用python,对可选参数感到困惑,比如我有这样的程序:
class B:
pass
class A:
def __init__(self, builds = B()):
self.builds = builds
如果我创造了两次
b = A()
c = A()
打印他们的版本
print b.builds
print c.builds
我发现他们用的是同样的东西
<__main__.B instance at 0x68ee0>
<__main__.B instance at 0x68ee0>
但这不是我想要的,因为如果b
更改了生成的某些内部状态,那么c
对象中的状态也将更改。
是否可以使用此可选参数语法每次重新创建此可选参数?
是;默认参数仅在定义函数时计算。
一种可能的解决方案是让参数是一个类而不是一个实例,一个
您需要执行以下操作:
这是一个非常广泛的错误,使用可变参数作为默认参数。可能会有很多人上当受骗。
为了有效地使用默认值,您需要了解默认值是如何工作的。
函数是对象。因此,它们具有属性。所以,如果我创建这个函数:
我创建了一个对象。其特点如下:
其中之一是
func_defaults
。听起来不错,里面有什么?这是一个包含函数默认值的元组。如果默认值是对象,则元组包含该对象的实例。
如果您认为
f
向列表中添加了一个项,而在没有提供列表的情况下返回仅包含该项的列表,则会导致一些相当违反直觉的行为:但是,如果您知道默认值是存储在函数属性之一中的对象实例,那么它就不那么违反直觉了:
知道了这一点,很明显,如果希望函数参数的默认值是一个新列表(或任何新对象),就不能简单地将对象的实例保存在
func_defaults
中。每次调用函数时都必须创建一个新的:相关问题 更多 >
编程相关推荐