In case you want to replace values in place, you can
update your original list with values from a list
comprehension by assigning to the whole slice of the original.
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
If you have multiple names pointing to the original list,
for example you wrote data2=data before changing the list
and you skip the slice notation for assigning to data,
data will rebind to point to the newly created list while data2 still points to the original unchanged list.
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]
Note: This is no recommendation for generally preferring one over the other
(changing list in place or not), but behavior you should be aware of.