On 18Apr2015 22:03, Bill Allen <walle...@gmail.com> wrote:
On Apr 18, 2015 4:11 PM, "boB Stepp" <robertvst...@gmail.com> wrote:
On Sat, Apr 18, 2015 at 3:28 PM, Bill Allen <walle...@gmail.com> wrote:
> On Apr 18, 2015 7:50 AM, "Peter Otten" <__pete...@web.de> wrote:
>> You can test your newfound knowledge by predicting the output of the
>> following script:
>>
>> a = [1, ["x", "y"], 3]
>> b = a[:]
>>
>> a[1][1] = "hello!"
>>
>> print(a) # [1, ['x', 'hello!'], 3]
>> print(b) # what will that print?
>>
>> Think twice before you answer. What is copied, what is referenced?
> print(b) will print the original copy of a which b now references which
is
> [1, ["x", "y"], 3]
Uh, oh! You should have checked your work in the interpreter before
replying! Peter is being very tricky!! (At least for me...) Look again
at that list inside of a list and... [...]
Ok, just tried it out. In this example b=a and b=a[:] seem to yield the
same results even after the change to a, which I do not understand. Should
not b be a copy of a and not reflect the change?
Because is it a _shallow_ copy. Doing this:
b = a[:]
produces a new list, referenced by "b", with the _same_ references in it as
"a". a[1] is a reference to this list:
["x", "y"]
b[1] is a reference to the _same_ list. So "a[:]" makes what is called a
"shallow" copy, a new list with references to the same deeper structure.
So this:
a[1][1] = "hello!"
affects the original x-y list, and both "a" and "b" reference it, so printing
either shows the change.
By contrast, this:
a[1] = ["x", "hello"]
_replaces_ the reference in "a" with a reference to a new, different, list.
Sometimes you want a "deep" copy, where "b" would have got a copy of the
iriginal x-y list. See the "copy" module's "deepcopy" function, which supplies
this for when it is needed:
https://docs.python.org/3/library/copy.html#copy.deepcopy
Cheers,
Cameron Simpson <c...@zip.com.au>
Draw little boxes with arrows. It helps. - Michael J. Eager
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor