代码之家  ›  专栏  ›  技术社区  ›  diciu

为什么list.append在布尔上下文中的值为false?[复制品]

  •  30
  • diciu  · 技术社区  · 16 年前

    这个问题已经有了答案:

    有什么理由 list.append 评估为假?或者仅仅是当成功时返回0的C约定才起作用?

    >>> u = []
    >>> not u.append(6)
    True
    
    7 回复  |  直到 8 年前
        1
  •  37
  •   Alex Martelli    16 年前

    对容器进行就地变异的大多数python方法返回 None --原理的应用 Command-query separation . (python总是相当实用,所以一些变量在得到有用的值时确实返回了一个值,否则会很昂贵或者很混乱-- pop 方法就是这种实用主义的一个很好的例子——但是这些绝对是例外,而不是规则,而且没有理由 append 例外情况)

        2
  •  20
  •   Matthieu M.    16 年前

    None 计算结果为 False 在python中,不返回任何内容的函数假定已经返回 没有 .

    如果键入:

    >> print u.append(6)
    None
    

    Tadaaam:)

        3
  •  6
  •   SilentGhost    16 年前

    因为 .append 方法返回 None 因此 not None 评估为 True . 出错时的python通常会引发一个错误:

    >>> a = ()
    >>> a.append(5)
    Traceback (most recent call last):
      File "<pyshell#1>", line 1, in <module>
        a.append(5)
    AttributeError: 'tuple' object has no attribute 'append'
    
        4
  •  5
  •   Matt Anderson    16 年前

    它在适当的位置修改列表,并返回 None . 计算结果为false。

        5
  •  3
  •   adam    16 年前

    事实上,它回来了 None

    
    >>> print u.append(6)
    None
    >>> print not None
    True
    >>> 
    
    
        6
  •  1
  •   Wizard    8 年前

    方法 append 就地修改列表和返回值 None

    在您的例子中,您正在动态创建一个数组“6”,然后丢弃它。变量b的返回值为none。

    为什么?
    这符合 Command–query separation 由伯特兰·迈耶设计。
    它指出,每个方法要么是执行操作的命令,要么是向调用者返回数据的查询,但不能同时返回这两者。 在您的示例中:

    u.append(6)
    

    追加 修改了的状态 [] 因此,返回符合原则的价值不是最佳实践。

    从理论上讲,这建立了一个健全性的衡量标准,这样人们就可以在不同时修改程序状态的情况下对程序状态进行推理。

    CQS非常适合于面向对象的方法,如Python。

        7
  •  0
  •   Rafael Aguilar    8 年前

    这个 list.append 函数不返回 None 只需将该值添加到用于调用该方法的列表中。

    以下是一些让事情更清楚的事情:

    >>> u = []
    >>> not u
    False
    >>> print(u.append(6)) # u.append(6) == None
    None    
    >>> not u.append(6) # not None == True
    True
    
    推荐文章