【问题标题】:Appending to a list comprehension in Python returns None在 Python 中附加到列表推导返回 None
【发布时间】:2018-12-05 20:12:21
【问题描述】:

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

考虑我有以下简单的例子,我通过列表理解生成一个列表:

>>> 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

【问题讨论】:

  • 这与列表推导无关,但与.append()[1, 2, 3].append(4) 也返回 None
  • 有意思,没想到自己上个单子试试

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


【解决方案1】:

@ScottMcClistdictionary 等可变对象上定义的方法主要对调用对象执行操作,并且不返回任何内容。

对于像 string 这样的不可变对象,您可能会看到,方法返回调用对象的修改形式(不同的对象)。 list的情况就不同了。

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

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

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

现在,看看下面的例子。

list 是可变对象。

在 list 上调用 sort() 方法直接修改了调用对象并且不返回任何内容(这就是为什么 None)。

调用 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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 众所周知,当 Python 函数不返回任何内容时,它会隐式返回 None
    • 如果您可以添加 Tomalak 对我的问题的评论中的一些内容,我会将其标记为正确。
    • @ScottMcC 按照建议完成。谢谢。
    【解决方案3】:

    您可以在列表理解中使用连接+ 而不是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]]
    

    【讨论】:

    • 这里的诀窍是通过添加 [] 使新元素成为一个列表。我不同意 python 不为我们这样做。我最终不得不不时重新解决这个问题
    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2011-07-23
    • 2012-11-08
    • 1970-01-01
    • 2020-07-21
    • 2018-06-22
    相关资源
    最近更新 更多