Issue 21943: To duplicate a list has biyective properties, not inyective ones (original) (raw)

Issue21943

Created on 2014-07-09 09:11 by Toni Diaz, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (3)
msg222606 - (view) Author: Toni Diaz (Toni Diaz) Date: 2014-07-09 09:11
Python 2.7.3 (default, Mar 13 2014, 11:03:55) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> a=['dog'] >>> b=a >>> a ['dog'] >>> b ['dog'] >>> b.remove('dog') >>> a [] >>> b [] >>> When defining a list from another (b=a), in my opinion, I expect that all you do to one doesn't affect to the other one. However, with the commands .remove & .append I don't see that (the definition b=a is bijective). Should it work this way? Thanks
msg222607 - (view) Author: Josh Rosenberg (josh.r) * (Python triager) Date: 2014-07-09 10:22
This is a natural consequence of Python using reference semantics. x = y just makes x and y references to the same object. For immutable objects like int and str, you'll never notice consequences of this, since changes to the value (x += 1) replace the reference in x with a new reference. But for mutable objects like lists, you need to explicitly copy (shallow or deep) to avoid a dependency of the sort you've encountered. For the specific case of sequences, the empty slice is the simplest, fastest way to perform a shallow copy: x = y[:] For other built-in types, you can often call .copy() or wrap in the constructor: newdict = olddict.copy() # or dict(olddict) For more complex cases, the copy module offers shallow and deep copy abilities (via the copy and deepcopy function) for arbitrary data structures.
msg222608 - (view) Author: Josh Rosenberg (josh.r) * (Python triager) Date: 2014-07-09 10:25
Short answer: This is not a bug. Run through one of the comprehensive Python tutorials on the net (or in Learning Python); reference semantics and their fairly varied consequences are covered in detail in most of them.
History
Date User Action Args
2022-04-11 14:58:05 admin set github: 66142
2014-07-09 10:47:05 mark.dickinson set status: open -> closedresolution: not a bug
2014-07-09 10:25:32 josh.r set messages: +
2014-07-09 10:22:59 josh.r set nosy: + josh.rmessages: +
2014-07-09 09:11:52 Toni Diaz create