代码之家  ›  专栏  ›  技术社区  ›  Eric Auld

在后面定义一个默认参数,没有:如果它是一个数组呢?

  •  2
  • Eric Auld  · 技术社区  · 7 年前

    我将一个参数传递给一个函数,以便以通常的方式延迟提供默认参数:

    def f(x = None):
        if x == None:
            x = ...
    

    唯一的问题是 x 可能是一个核阵列。那么 x == None 返回一个布尔数组,我无法对其设置条件。编译器建议使用 .any() .all()

    但如果我写信

    def f(x = None):
        if (x == None).any():
            x = ...
    

    如果 转到其默认值,因为 None == None 是一个布尔值,它没有 .any() .all() 方法。我来这里干什么?

    1 回复  |  直到 7 年前
        1
  •  6
  •   user3483203    7 年前

    对比时 None ,这是使用 is == 是的。通常这并没有什么区别,但是由于对象可以自由地以任何他们认为合适的方式实现相等,所以它并不总是一个可靠的选项。

    不幸的是,这是其中之一 == 不会剪切它,因为与numpy数组比较会根据条件返回一个布尔掩码。幸运的是,只有一个 在任何给定的python程序中,我们都可以使用 接线员确认是否 或者不。

    >>> None is None
    True    
    >>> np.array([1,2,3]) is None
    False
    

    所以没必要 any all ,可以将函数更新为:

    def f(x=None):
         if x is None:
             print('None')
         else:
            print('Not none')
    

    行动中:

    >>> f()
    None
    >>> f(np.array([1,2,3]))
    Not none