为什么不能在同一行中构造和修改列表?

时间:2019-07-24 01:56:21

标签: python list

例如,为什么a不等于b

a = [1]
a.append(2)
print(a)  # [1, 2]

b = [1].append(2)
print(b)  # None

b的语法在我看来并没有错,但是确实如此。我想编写单行代码来定义列表(例如,使用生成器表达式),然后附加元素,但我得到的只是None

3 个答案:

答案 0 :(得分:2)

b的单线执行以下步骤:

  1. 定义列表[1]
  2. 2附加到就地列表中
  3. 追加没有回报,因此b = None

所有list方法都适用,这些方法就地更改了列表而没有返回值。这些都是None

c = [1].extend([2])
d = [2, 1].sort()
e = [1].insert(1, 2)
...

如果您想要与定义和扩展类似的单线,则可以

c2 = [1, *[2]]

可以用来组合两个生成器表达式。

答案 1 :(得分:2)

这是因为:

appendextendsort和更多列表功能都是“就地”。

“就地”是什么意思?这意味着它将直接修改原始变量,这是您需要做的一些事情:

l = sorted(l)

要修改列表,但是append已经做到了,所以:

l.append(3)

将已经修改l,不需要:

l = l.append(3)

如果您这样做:

l = [1].append(2)

是的,它将修改[1]的列表,但是它将丢失在无法访问的内存中,而l将变成None,如我们上面发现的那样。

要使其不“就地”,而不使用append,请执行以下操作:

l = l + [2]

或者:

l = [*l, 2]

答案 2 :(得分:0)

Python中“列表”类下的所有内置方法都只是“原位”修改列表。他们只更改原始列表,什么也不返回。

优点是,您不需要在每次修改对象时将其传递给原始变量。同时,您不能在一行代码(例如Javascript中使用的代码)中累计调用其方法。因为Javascript总是将其对象转换为DOM,而Python却没有。