【问题标题】:Why doesn't [].extend(list1) create an identical list to list1? [duplicate]为什么 [].extend(list1) 不创建与 list1 相同的列表? [复制]
【发布时间】:2013-01-07 12:20:45
【问题描述】:

可能重复:
Python list extension and variable assignment

字符串的类比是正确的:

string1 = 'abc'
''.join(string1) == string1 # True

那么为什么这不成立:

list1 = ['a', 'b', 'c']
[].extend(list1) == list1 # AttributeError: 'NoneType' object has no attribute 'extend'

type([]) 返回列表。为什么它会被视为 NoneType 而不是具有扩展方法的列表?

这是一个学术问题。我不会这样做是常规代码,我只是想了解。

【问题讨论】:

  • 附带说明一下,从 API 的角度来看,您可能会觉得这很有趣。不同之处在于字符串是不可变的,因此字符串方法必须返回新的字符串。列表是可变的,因此可以使用列表方法来修改对象本身。当对象本身被修改时,最好返回None 以让用户知道列表已被修改。
  • Python 列表没有流畅的接口,在this thread 中我提出了具有这种行为的自定义列表类型。
  • 这绝对不是一模一样的副本。

标签: python


【解决方案1】:

因为list.extend() 就地修改列表并且不返回列表本身。你需要做的是:

lst = ['a', 'b', 'c']
cplst = []
cplst.extend(lst)
cplst == lst

您引用的函数并不是真正相似的。 join() 返回一个新字符串,该字符串通过将迭代器的成员与joined on 的字符串连接在一起而创建。类似的list 操作看起来更像:

def JoiningList(list):

    def join(self, iterable):
        new_list = iterable[0]
        for item in iterable[1:]:
            new_list.extend(self)
            new_list.append(item)
        return new_list

【讨论】:

  • cplst + lst == lst 在这里更相关,因为它更类似于他对字符串所做的事情。
  • @LennartRegebro -- 我不认为它更相关......虽然这会起作用,但它并不能解释为什么其他形式会发生不平等。
  • @mgilson:这个解释出现在答案的第一句话中。这个例子是“你需要做什么才能得到你所期望的”。使用+ 更类似于字符串示例。
  • 没有内置列表操作(至少据我所知)确实可以与join() 媲美。与join() 相比,appendextend+ 都更像是简单的字符串连接(或展平 + 连接)。我试图说明您将如何使用extend 以 OP 所期望的方式工作;我认为使用+ 更像是在乞求问题(尽管我可以看到你来自哪里,因为它创建了一个新的列表实例)。
【解决方案2】:

您正在尝试将扩展程序的返回值与列表进行比较。 extend 是就地操作,这意味着它不会返回任何内容。

另一方面,join实际上返回的是运算结果,所以可以比较两个字符串。

【讨论】:

    【解决方案3】:
    >>> first = [1,2,3]
    >>> second = []
    >>> second.extend(first)
    >>> first == second
    True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2021-04-27
      • 1970-01-01
      • 2019-09-26
      • 2020-10-15
      相关资源
      最近更新 更多