[Tutor] python dictionaries (copy by reference or copy by value?)
Ben Finney
ben+python at benfinney.id.au
Sun May 3 03:18:16 CEST 2015
Alex McFerron <pythonistaforhire at gmail.com> writes:
> trying to understand why this is true
>
> step 1: x = {}
Assignment; binds a reference (the name ‘x’) to a newly-created empty
dictionary.
> step 2: y = x
Assignment; binds a reference (the name ‘y’) to the object currently
referred to by ‘x’. That's the same object as above.
> step 3: x['key'] = 'value'
Assignment; binds a reference (the item keyed by the string ‘'key'’ in
the same dictionary as above) to the string object ‘'value'’.
> # at this point if i print x or y i see {'key', 'value'}
Because there's only one dictionary in all of this.
> step 4: x['key'] = 'newValue'
Assignment; binds a reference, the same reference as before (the item
keyed by the string ‘'key'’ in the same dictionary as above) to the
string object ‘'newValue'’.
> #and at this point printing x or y i see {'key', 'newValue'} and this
> is true if this was y['key']
Because there's only one dictionary in all of this.
> because of the behavior in step 4, i'm thinking, ok the copy job from
> step 2 was a pointer only and not a by value copy job. fair enough
None of these operations are copies. Assignment in Python is *never* a
copy operation.
> step 5: x = {}
Assignment; binds a reference (the name ‘x’) to a newly created empty
dictionary.
> step 6: print both. and what i get here is that x will be empty but y will
> not (or visa verse)
Because the name ‘y’ is still a reference to the original dictionary above.
> question: if y=x from step 2 (the copy job)
There's your error. Assignment in Python *never* copies, it only binds a
reference to some value.
--
\ “If you continue running Windows, your system may become |
`\ unstable.” —Microsoft, Windows 95 bluescreen error message |
_o__) |
Ben Finney
More information about the Tutor
mailing list