realpython / python-guide

Python best practices guidebook, written for humans.
https://docs.python-guide.org
Other
28.18k stars 5.82k forks source link

Code Style - not really good list manipulation example - needs explanation #1086

Open vbrozik opened 3 years ago

vbrozik commented 3 years ago

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:

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.

dbader commented 3 years ago

Thanks for flagging this -- want to send in a pull-request to update that section?

vbrozik commented 3 years ago

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: