function call questions

chenyong20000 at gmail.com chenyong20000 at gmail.com
Sat Oct 22 04:39:02 EDT 2016


在 2016年10月20日星期四 UTC+8下午11:04:38,Frank Millman写道:
> 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
Hi Frank,

thanks for your kind help. What confused me is at this line:

> >>> r = r.setdefault('b', {})

and its previous one

> >>> r = r.setdefault('a', {})

When r.setdefault('a',{}) is run, I understand it will return an empty {}. At this time both r & t reference to {'a':{}}, right? So when "r = r.setdefault('a',{})" is run, r reference to {} while t keeps the same as {'a':{}}.

then comes r.setdefault('b',{}). What hinder me is here. since r has changed its reference to {}, r.setdefault('b',{}) will return {} again. So what does this done to t? why at this time t changes to {'a':'b':{}}? Sorry for my silly here. Thanks





More information about the Python-list mailing list