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

Reply via email to