正如其他人所说,append 会改变列表本身,您不应该将其分配给变量。执行它会改变它的数据,有效地更新指向它的每个人。
但是,当我想以功能*的方式做一些事情时,我会使用一个技巧,同时改变现有对象(而不是构造新对象,在这种情况下使用 a=[x + ['a'] for x in a],或者特别是x + ['a'])。
所以,如果你足够勇敢,你也可以这样做:
>>> a=[[1,2],[3,4],[5,6]]
>>> a=[x.append('a') or x for x in a]
>>> a
[[1, 2, 'a'], [3, 4, 'a'], [5, 6, 'a']]
这是因为append 返回None,而or 继续搜索一个真值,x 是(它是一个list 与 at至少是附加到它的)。
我为什么需要这个?
假设您有一个列表,并且您想将其中的一些成员插入到一个新列表中,并相应地更新引用:
所以你有列表all:
>>> all = [[], [], [], []]
其中一些被插入并更新到一个新列表x:
>>> x = [i.append('x') or i for i in all[:2]]
>>> x
[['x'], ['x']]
all 的一部分也被插入并更新到列表y:
>>> y = [i.append('y') or i for i in all[1:3]]
all 已更新:
>>> all
[['x'], ['x', 'y'], ['y'], []]
但是x也更新了:
>>> x
[['x'], ['x', 'y']]
并且y按预期生成:
>>> y
[['x', 'y'], ['y']]
总体而言,对于简单的任务,我建议使用for 循环显式更新。这就是pythonic。
从技术上讲,如果您可以访问列表类,则可以将其设为函数:
def more_functional_append(self, x):
self.append(x)
return self
-
functional programming 基于每条语句本质上只做一件事,并且没有副作用(因此,不会变异和返回)。
append 不是很实用,因为它会改变一个列表(纯函数式编程只有不可变对象)并且不返回结果以传递给其他操作(函数)。使用函数式编程概念,您可以创建没人能读懂的大型单行代码,也称为“工作安全”或“坏代码”。