代码之家  ›  专栏  ›  技术社区  ›  ScottMcC

追加到python中的列表理解将返回none

  •  3
  • ScottMcC  · 技术社区  · 6 年前

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

    假设我有以下简单的示例,通过列表理解生成一个列表:

    >>> 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 回复  |  直到 6 年前
        1
  •  4
  •   ScottMcC    6 年前

    append 只在变量上工作,而不是列表文本,因为它更新列表对象本身,并且不返回结果列表。

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

    >>> [1, 2, 3].append(4) == None
    True
    
        2
  •  1
  •   Nidhin Sajeev    6 年前

    你可以用浓缩法 + 而不是 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]]
    
        3
  •  1
  •   hygull    6 年前

    @斯科特马克 ,在可变对象上定义的方法 列表 ,请 词典 主要对调用对象执行操作,不返回任何内容。

    在不可变物体的情况下 一串 可以看到,方法返回调用对象的修改后的形式(另一个对象)。万一 列表 是不同的。

    您不能期望下面的操作 列表 一种可变的对象。

    s = "hello DJANGO"
    s2 = s.upper() 
    s3 = s.lower() 
    
    print(s)  # hello DJANGO
    print(s2) # HELLO DJANGO
    print(s3) # hello django
    

    现在,看看下面的例子。

    列表 是可变对象。

    打电话 排序() List上的方法直接修改了调用对象,没有返回任何内容(这就是为什么 )。

    打电话 已排序() 函数不会更改传递列表。它基于传递的列表创建单独的排序列表。因为它不是在列表对象上定义的方法,所以它返回新的排序列表。

    附加() 方法将项附加到调用列表中,不返回任何内容。一旦调用它,就完成了列表的更新(附加项目)。

    # 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