当前位置: 首页 > 面试题库 >

方法的默认参数值*一次*

章安易
2023-03-14
问题内容

我发现新类中的子类化和字典更新有一个奇怪的问题:

Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on
win32
>>> class a(object):
...     def __init__(self, props={}):
...             self.props = props
...
>>> class b(a):
...     def __init__(self, val = None):
...             super(b, self).__init__()
...             self.props.update({'arg': val})
...
>>> class c(b):
...     def __init__(self, val):
...             super(c, self).__init__(val)
...
>>> b_inst = b(2)
>>> b_inst.props
{'arg': 2}
>>> c_inst = c(3)
>>> c_inst.props
{'arg': 3}
>>> b_inst.props
{'arg': 3}
>>>

在调试中,在第二个调用(c(3))中,您可以看到a构造函数self.props内已经等于{'arg': 2},并且在此b之后调用构造函数时,这{'arg': 3}两个对象都变为了!

同样,构造函数调用的顺序为:

  a, b    # for b(2)
  c, a, b # for c(3)

如果在构造函数中替换self.props.update()为,一切都会正常,并且将按预期方式运行self.props = {'arg': val}``b

但是我确实需要 更新 此属性,而不是替换它。


问题答案:

props不应具有这样的默认值。改为这样做:

class a(object):
    def __init__(self, props=None):
        if props is None:
            props = {}
        self.props = props

这是一个常见的python “ gotcha”。



 类似资料:
  • 问题内容: 如果未将显式值传递给方法,我想用一些默认值初始化方法的参数-像这样: 我得到了错误: 我该如何解决? 问题答案: 这里常见的习惯用法是将默认值设置为一些哨兵值用于此目的,这是典型值,然后您可以检查该值。 您可能还会看到用于哨兵的实例。 后一个版本的优点是可以传递给函数,但有一些缺点(请参见下面@larsmans的评论)。如果您不认为需要将有意义的参数传递给您的方法,那么我建议您使用它。

  • 我如何在从下面的API生成的swagger中定义属性的默认值? Swashbuckle生成OrderDirection作为所需参数。我希望它是可选的,并向客户机指示默认值(不确定swagger是否支持此选项)。 我不喜欢使属性类型为空。还有其他选择吗?理想情况下使用内置类... 我用的是虚张声势的皮带扣。AspNetCore-https://docs.microsoft.com/en-us/asp

  • 对于一些函数,你可能希望它的一些参数是 可选 的,如果用户不想要为这些参数提供值的话,这些参数就使用默认值。这个功能借助于默认参数值完成。你可以在函数定义的形参名后加上赋值运算符(=)和默认值,从而给形参指定默认参数值。 注意,默认参数值应该是一个参数。更加准确的说,默认参数值应该是不可变的——这会在后面的章节中做详细解释。从现在开始,请记住这一点。 使用默认参数值 例7.5 使用默认参数值 #!

  • Scala 函数 Scala 可以为函数参数指定默认参数值,使用了默认参数,你在调用函数的过程中可以不需要传递参数,这时函数就会调用它的默认参数值,如果传递了参数,则传递值会取代默认值。实例如下: object Test { def main(args: Array[String]) { println( "返回值 : " + addInt() ); } def

  • Scala允许您指定函数参数的默认值。 可以选择在函数调用中省略这种参数的参数,在这种情况下,相应的参数将使用默认值填充。 如果指定其中一个参数,则第一个参数将使用该参数传递,第二个参数将从默认值中获取。 尝试以下示例,它是为函数指定默认参数的示例 - 例子 (Example) object Demo { def main(args: Array[String]) { print

  • 问题内容: 这个问题已经在这里有了答案 : 有没有办法将默认参数设置为等于另一个参数值? (4个答案) 5年前关闭。 是否可以在同一函数定义中将函数参数的默认值定义为另一个参数?就像是: 但这没用。 问题答案: 不可以。Python解释器认为要说法的默认值分配到一个全局变量时,没有一个全局变量。 您可能想要尝试这样的事情: