python-guide icon indicating copy to clipboard operation
python-guide copied to clipboard

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

Open vbrozik opened this issue 4 years ago • 2 comments

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.

vbrozik avatar Jan 06 '21 22:01 vbrozik

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

dbader avatar Jan 06 '21 23:01 dbader

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

vbrozik avatar Feb 12 '21 13:02 vbrozik