例如,为什么a
不等于b
?
a = [1]
a.append(2)
print(a) # [1, 2]
b = [1].append(2)
print(b) # None
b
的语法在我看来并没有错,但是确实如此。我想编写单行代码来定义列表(例如,使用生成器表达式),然后附加元素,但我得到的只是None
。
答案 0 :(得分:2)
b
的单线执行以下步骤:
[1]
2
附加到就地列表中b = None
所有list
方法都适用,这些方法就地更改了列表而没有返回值。这些都是None
:
c = [1].extend([2])
d = [2, 1].sort()
e = [1].insert(1, 2)
...
如果您想要与定义和扩展类似的单线,则可以
c2 = [1, *[2]]
可以用来组合两个生成器表达式。
答案 1 :(得分:2)
这是因为:
append
,extend
,sort
和更多列表功能都是“就地”。
“就地”是什么意思?这意味着它将直接修改原始变量,这是您需要做的一些事情:
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却没有。