python类默认参数

python类默认参数,python,Python,我想知道是否有人能解释为什么这两个例子最终会产生相同的结果: class Myclass(): def __init__ (self, parameter=None) if parameter is None: self.parameter = 1.0 else: self.parameter = parameter 以及: 我直觉上理解第一个“如果。。。“没有”,但我很难理解第二个例子。两者都可以使用吗 我意识到这可能是一个相当简单

我想知道是否有人能解释为什么这两个例子最终会产生相同的结果:

class Myclass(): 

def __init__ (self, parameter=None)

    if parameter is None: 
        self.parameter = 1.0 
    else: 
        self.parameter = parameter
以及:

我直觉上理解第一个“如果。。。“没有”,但我很难理解第二个例子。两者都可以使用吗

我意识到这可能是一个相当简单的问题,因此,如果有人能指导我阅读任何有助于理解差异的书籍,那将是非常好的


谢谢

在第一个示例中,仅当
参数
按字面意思为
时,该条件才为真

在第二个示例中,该条件仅适用于truthy值

一种更简单的方法是:

def meth1 (parameter):
  return parameter is None

def meth2 (parameter):
  return not(bool(parameter))

print([(meth1(v), meth2(v)) for v in [False, None, 0]])

> [(False, True), (True, True), (False, True)]

它们不是等价的,在第一个代码段中,
参数
将为1.0当且仅当
参数
,但在第二个代码段中,
参数
对于任何
错误值
都将为1.0。以下值在Python中均为
错误

  • 没有

  • 假的

  • 任何数字类型的零,例如0、0L、0.0、0j

  • 任何空序列,例如,,(),[]

  • 任何空映射,例如,{}

  • 用户定义类的实例,如果类定义了非零()或len()方法,则该方法返回整数零或布尔值False

因此,第一个代码段更加严格。正式文件请参阅:

  • Python 2:
  • Python 3:

它们并不总是返回相同的结果。尝试使用sending parameter=0查看该值。
None
为falsy,因此在第二种情况下使用默认值时采用else分支。但是,也有例外。看看。。。我更喜欢第一个例子!如果你想
MyClass(0.)
你想
参数
0.
还是
1.
?你能用一个简单的例子来证明这一点吗?我在外面淋雨,水弄脏了我的触摸屏,所以任何打字都很困难。我也误解了这个问题。现在更新。这很有意义,谢谢你的回答和链接!
def meth1 (parameter):
  return parameter is None

def meth2 (parameter):
  return not(bool(parameter))

print([(meth1(v), meth2(v)) for v in [False, None, 0]])

> [(False, True), (True, True), (False, True)]