【问题标题】:Python: finding out differences between + and extend from the docsPython:从文档中找出 + 和扩展之间的区别
【发布时间】:2019-04-07 09:24:19
【问题描述】:

我读了这篇文章: What's the difference between [a] + [b] and [a].extend([b])?

它表示就列表而言,列表之间的“+”创建一个新列表并扩展更改操作的列表。

[1,2,3] + [4]

[1,2,3].extend([4])

有没有什么方法可以在不深入文档的情况下获取这些信息,而只使用使用 help() 或 dir() 的解释器?

【问题讨论】:

  • 你的问题非常元。您最好查看在线文档...或者您打算迁移到没有互联网的地方? ;)

标签: python python-3.x


【解决方案1】:

将自己限制在解释器中,一种方法是通过实例方法的文档字符串。您可以通过help(list.extend)__doc__ 属性访问它。例如:

>>> list.extend.__doc__
'Extend list by appending elements from the iterable.'

至于+ 运算符合并两个列表,这要归功于list 类的运算符重载。在幕后,它是通过一个名为__add__ 的特殊方法实现的。使用与上述相同的方法:

>>> list.__add__.__doc__
'Return self+value.'

话虽如此,在线文档无疑是访问这些信息的一种不那么复杂的方式。

【讨论】:

    【解决方案2】:

    这可能不是您想要的,但您可以从解释器轻松检查验证此行为。

    >>> l1 = [1,2,3]
    >>> l2 = [4]
    >>> l1 + l2, l1, l2
    ([1,2,3,4], [1,2,3], [4])
    >>> l1.extend(l2), l1, l2
    (None, [1,2,3,4], [4])
    

    【讨论】:

      【解决方案3】:

      A.如果函数(方法)修改数据并且不返回结果,则必须将变异对象作为函数输入传递给它。这称为就地修改。

      此类函数通常故意不返回任何内容 (None)。这个约定在list.sort 中有很好的描述:

      这个方法就地修改了序列...... 提醒用户它是并行操作的 效果,它不会返回排序后的序列

      请注意,存在一种称为“Fluent interface”的技术,它基于需要相反方法的方法链接。


      B.如果创建了新对象,您可以随时检查 id()

      >>> l1 = [1,2,3,4]
      >>> l2 = ['A','B','C']
      >>> id(l1), id(l2), id(l1+l2)
      (139855120180552, 139855123390792, 139855123880392)
      

      【讨论】:

        猜你喜欢
        • 2011-03-30
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 2011-10-22
        • 2019-07-12
        • 2017-10-30
        • 1970-01-01
        • 2017-09-29
        相关资源
        最近更新 更多