Как уже говорили другие, 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
продолжает поиск значения true-y, которое x
равно (это list
по крайней мере с что было добавлено к нему).
Зачем мне это нужно?
Допустим, у вас есть список, и вы хотите вставить некоторых его членов в новый список и соответствующим образом обновить ссылки:
Итак, у вас есть список 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
. Это то, что считается питоническим.
Технически говоря, если бы у вас был доступ к списку классов, вы могли бы сделать это функцией:
def more_functional_append(self, x):
self.append(x)
return self
- функциональное программирование основано на каждом утверждении, делающем по существу одну вещь, и не имеющем побочных эффектов (то есть не мутирующем и не возвращающем).
append
не очень функциональный, поскольку он мутирует список (чисто функциональное программирование имеет только неизменяемые объекты) и не возвращает результат для передачи другим действиям (функциям). Используя концепцию функционального программирования, вы можете создавать большие однострочники, которые никто не может прочитать, также известные как «безопасность работы» или «плохой код».