python-guide
python-guide copied to clipboard
Code Style - not really good list manipulation example - needs explanation
In the Code Style chapter examples - Short Ways to Manipulate Lists there is an example "Add three to all list members."
"bad"
for i in range(len(a)):
a[i] += 3
"good"
a = [i + 3 for i in a]
Unfortunately the "bad" and "good" examples do a different things:
- "bad" modifies the original list in place
- "good" creates a new modified list and does not change the original object - not exactly "Add three to all list members."
Although the "good" code looks cleaner the result could be unwanted for example in case of huge lists or required side-effect of modifying the original list. The code at least needs an explanation.
Thanks for flagging this -- want to send in a pull-request to update that section?
Excuse my delayed reply. I am still learning Python a lot and in many cases I do not know what is the best way to perform certain task in the language. Also I am not sure if I know English good enough to contribute to an English book. So certainly I need a discussion first :)
Regarding the example above I would explain:
For large lists it could be inappropriate to create a new list to replace the old one because of memory requirements. In such cases the good solution is to modify the list in-place:
for i, _ in enumerate(a): a[i] += 3
PS: Originally I thought that the code below would be the right solution but as the original "good" solution it also creates a new list and only then it assigns its elements to the original list.
a[:] = (i + 3 for i in a)
See:
- https://stackoverflow.com/questions/53286531/assign-iterators-to-a-python-slice
- https://stackoverflow.com/questions/11877212/python-slice-assignment-of-generator-to-list