python类默认参数

时间:2017-04-18 23:14:18

标签: python

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

class Myclass():

def __init__ (self, parameter=None)

    if parameter: 
        self.parameter = parameter 
    else: 
        self.parameter = 1.0

if ! find some_directory -type d|while read dir_name; do
  if [ -w "$dir_name" ]; then
    exit 1
  fi
done; then exit 1; fi

我直观地理解了第一个'如果......是无',但我对第二个例子感到困惑。两者都可以使用吗?

我意识到这可能是一个非常简单的问题,因此,如果有人能指导我阅读任何有助于理解那些伟大的差异的阅读。

谢谢!

2 个答案:

答案 0 :(得分:2)

它们不是等效的,在第一个代码段中,当{并且仅当 parameterparameter时,None将为1.0 ,但在第二个代码段中,parameter对于任何falsy value都是1.0。以下值均为Python中的falsy

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

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

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

  • 用户定义类的实例,如果类定义非零()或 len ()方法,则该方法返回整数零或bool值假。

所以第一个代码片段更严格。官方文档请参考:

答案 1 :(得分:1)

在第一个示例中,只有parameter字面上为None时,条件才会为真。

在第二个例子中,条件只适用于真值。

一种更简单的显示方式是:

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)]