为什么[] .extend(list1)没有为list1创建一个相同的列表?

时间:2013-01-23 21:20:05

标签: python

  

可能重复:
  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而不是具有extend方法的列表?

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

3 个答案:

答案 0 :(得分:11)

因为list.extend()修改了列表并且没有返回列表本身。为了得到你的期望,你需要做的是:

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

您引用的功能并不是真正类似的。 join()返回一个新字符串,该字符串是通过将迭代器的成员与join编辑的字符串连接而创建的。类似的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

答案 1 :(得分:5)

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

另一方面,

join实际上返回了操作的结果,因此可以比较两个字符串。

答案 2 :(得分:0)

>>> first = [1,2,3]
>>> second = []
>>> second.extend(first)
>>> first == second
True