В случае, если вы хотите, чтобы заменить значения в месте, вы можете обновите свой первоначальный список со значениями из списка comprehensi путем присвоения всего фрагмента оригинала.
data = [*range(11)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
id_before = id(data)
data[:] = [x if x % 2 else None for x in data]
data
# Out: [None, 1, None, 3, None, 5, None, 7, None, 9, None]
id_before == id(data) # check if list is still the same
# Out: True
Если у вас есть несколько имен, указывающих на первоначальный список, , например, Вы писали data2=data
перед изменением списка и пропустить срезо обозначения для присвоения data
, data
будет перепривязывает, чтобы указать на вновь созданный а data2
по-прежнему указывает на первоначальный неизменный список.
data = [*range(11)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
data2 = data
id_before = id(data)
data = [x if x % 2 else None for x in data] # no [:] here
data
# Out: [None, 1, None, 3, None, 5, None, 7, None, 9, None]
id_before == id(data) # check if list is still the same
# Out: False
data2
# Out: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Примечание: Это не рекомендация, как правило, предпочитая один над другим (изменение списка на месте или нет), но поведение, которое вы должны быть в курсе.
использовать модуль itertools, это самый эффективный. – LtWorf
Для сравнения с заменой «на месте» ознакомьтесь с этим [ответом] (http://stackoverflow.com/a/24203748/307454) – lifebalance