function call questions
Frank Millman
frank at chagford.com
Thu Oct 20 11:03:43 EDT 2016
wrote in message
news:01cfd810-0561-40b1-a834-95a73dad6e56 at googlegroups.com...
在 2016年10月20日星期四 UTC+8下午1:32:18,Frank Millman写道:
> wrote in message
> news:5506e4d8-bd1d-4e56-8d1b-f71fa8293393 at googlegroups.com...
>
> > Let's see if I can explain. I am using 't' and 'r' instead of 'tree' and
> > 'root', but otherwise it is the same as your original example.
> >
> > >>> t = {}
> > >>> r = t
> > >>> id(t)
> > 2542235910088
> > >>> id(r)
> > 2542235910088
> >
> > At this point, t and r are both references to the same empty dictionary.
> >
> > >>> r = r.setdefault('a', {})
> >
> > This has done two things.
> >
> > It has inserted the key 'a' into the dictionary, and set its value to
> > {}.
> >
> > >>> t
> > {'a': {}}
> > >>> id(t)
> > 2542235910088
> >
> > It has also rebound 'r' so that it now references the new empty
> > dictionary
> > that has been inserted.
> >
> > >>> r
> > {}
> > >>> id(r)
> > 2542234429896
> > >>>t['a']
> > {}
> > >>> id(t['a'])
> > 2542234429896
> >
> > Now continue this process with r = r.setdefault('b', {}), and watch what
> > happens.
>
> thanks very much for your kind help. Your reply is clear. But I'm hindered
> by those you've not explained.
>
> I'm always confused by "r = r.setdefault('a', {})". when the first loop
> finished, as what you have pointed out,
> > >>> t
> > {'a': {}}
> > >>> r
> > {}
>
> Then next "r = r.setdefault('b', {})" will run again. Here what is "r" in
> "r.setdefault('b',{})"? According to final result, it should be "t['a']",
> which I can't understand. I thought the command is r.setdefault, so it
> should still be last "r", i.e., empty {}. Could you please let me know
> what I missed? thanks.
Firstly, I want to explain more clearly what I am doing here.
Instead of running your loop 3 times, I am running your command three times
one step at a time (though I only showed the first one).
>>> t = {}
>>> r = t
>>> r = r.setdefault('a', {})
>>> r = r.setdefault('b', {})
>>> r = r.setdefault('c', {})
This should give exactly the same result as your loop. The benefit of
running it this way is that you can check the values after each step.
May I suggest that you do this, and try to understand the contents of 't'
and 'r' at each point. If you are still unsure, let us know at which point
the values are not what you expect, and I will try to explain further.
It is important that you understand that you are rebinding 'r' at each step,
so after each command, 'r' is no longer referencing the same object that it
was referencing in the previous step.
To see the difference, try running it it this way -
>>> t = {}
>>> r = t
>>> r.setdefault('a', {})
>>> r.setdefault('b', {})
>>> r.setdefault('c', {})
Hope this helps.
Frank
More information about the Python-list
mailing list