在Python中附加到列表理解后将返回None

时间:2018-06-27 03:35:50

标签: python python-3.x list-comprehension

这是出于好奇而不是试图将其用于实际目的的问题。

考虑一下,我有一个简单的示例,其中我通过列表理解生成了一个列表:

>>> a = [1, 2, 3]
>>> b = [2 * i for i in a]
>>> b
[2, 4, 6]
>>> b.append(a)
>>> b
[2, 4, 6, [1, 2, 3]]

但是,如果我尝试一次完成所有操作

>>> a = [1, 2, 3]
>>> b = [2 * i for i in a].append(a)
>>> b == None
True

结果返回None。有什么理由吗?

我本以为这样的动作会返回第一个示例中的答案,或者抛出错误。

作为参考,我正在使用Python 3.6.5

3 个答案:

答案 0 :(得分:4)

append仅适用于变量,而不适用于列表文字,因为它会更新列表对象本身,并且不返回结果列表。

如@Tomalak所述,在简单列表上运行类似的操作也会返回None

>>> [1, 2, 3].append(4) == None
True

答案 1 :(得分:1)

您可以在列表理解中使用缩写+代替append

In [1]: a = [1, 2, 3]

In [2]: b = [2 * i for i in a] + [a]

In [3]: b
Out[3]: [2, 4, 6, [1, 2, 3]]

答案 2 :(得分:1)

@ScottMcC ,在诸如 list dictionary 之类的可变对象上定义的方法,大多数对调用对象执行操作,并且不返回任何内容。 / p>

对于不可变的对象,例如 string ,您可能会看到,方法会返回调用对象的修改形式(不同的对象)。如果是列表,则有所不同。

  

您不能期望 list 类型的可变对象进行以下操作。

s = "hello DJANGO"
s2 = s.upper() 
s3 = s.lower() 

print(s)  # hello DJANGO
print(s2) # HELLO DJANGO
print(s3) # hello django

现在,看看下面的例子。

  

列表是可变对象。

     列表中的

调用 sort()方法直接修改了调用对象,并且不返回任何内容(这就是的原因)。

     

调用 sorted()函数不会更改传递列表。它根据传递的列表创建一个单独的排序列表。由于它不是在列表对象上定义的方法,因此它将返回新的排序列表。

     

append()方法将项目追加到调用列表中,并且不返回任何内容。调用它后,就完成了更新(添加项目)列表的操作。

# sort() method defined on list updates the calling list
# As it updates current list, it doesn't return anything. That's why None.
a = [5, 8, 1, 2, 7]
n = a.sort()
print (a)
print(n)
print ()

# sorted() function returns a new sorted list 
# It doesn't update the calling list a2 
a2 = [5, 8, 1, 2, 7];
n = sorted(a2);
print (a2)
print(n)
print()

# append() is method defined on list, it updates calling list so it doesn't return anything (None)
l = []
n = l.append(34)
print(l)
print (n)

输出

[1, 2, 5, 7, 8]
None

[5, 8, 1, 2, 7]
[1, 2, 5, 7, 8]

[34]
None