Python 为什么';t[].extend(列表1)是否创建与列表1相同的列表?

Python 为什么';t[].extend(列表1)是否创建与列表1相同的列表?,python,Python,可能重复: 字符串的模拟值适用于: string1 = 'abc' ''.join(string1) == string1 # True 那么为什么这不成立呢: list1 = ['a', 'b', 'c'] [].extend(list1) == list1 # AttributeError: 'NoneType' object has no attribute 'extend' type([])返回列表。为什么它会被认为是一个非类型而不是一个具有extend方法的列表 这是一个学术问题

可能重复:

字符串的模拟值适用于:

string1 = 'abc'
''.join(string1) == string1 # True
那么为什么这不成立呢:

list1 = ['a', 'b', 'c']
[].extend(list1) == list1 # AttributeError: 'NoneType' object has no attribute 'extend'
type([])
返回列表。为什么它会被认为是一个非类型而不是一个具有extend方法的列表

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

因为
list.extend()
会修改列表,而不会返回列表本身。你需要做的是获得你所期望的:

lst = ['a', 'b', 'c']
cplst = []
cplst.extend(lst)
cplst == lst
您引用的函数实际上并不相似
join()。类似的
列表
操作看起来更像:

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

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


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

作为旁注,您可能认为从API的角度来看,这感觉很有趣。区别在于字符串是不可变的,因此字符串方法必须返回新字符串。列表是可变的,因此可以使用列表方法修改对象本身。当对象本身被修改时,最好返回
None
,让用户知道列表被修改了。Python列表没有流畅的接口,在年,我提出了一个具有这种行为的自定义列表类型。这绝对不是完全重复的。
cplst+lst==lst
在这里更相关,因为这更像是他用绳子做的。@Lennartreegebro——我不认为这更相关。。。虽然这会起作用,但它不能解释为什么不平等会发生在另一种形式上。@mgilson:答案的第一句话就是这个解释。例如“你需要做什么才能得到你所期望的”。使用
+
与字符串示例更为相似。没有任何内置列表操作(至少据我所知)可以与
join()
相比
append
extend
+
都比
join()
更像简单的字符串连接(或展平+连接)。我试图说明如何使用
extend
以OP期望的方式工作;我认为使用
+
更像是在回避这个问题(尽管我可以看到您来自哪里,因为它创建了一个新的列表实例)。
>>> first = [1,2,3]
>>> second = []
>>> second.extend(first)
>>> first == second
True