On 12/04, LJ wrote: > Hi All, > > I have a quick question regarding the modification of global variables within > functions. To illustrate, consider the following toy example: > > a={"1": set()} > b=9 > > def gt(l): > a["1"] = a["1"] | set([l]) > > When calling this last function and checking the a dictionary, I get: > > >>> gt(5) > >>> a > {"1": set([5])} > > > The set in the dictionary was modified. The question is, why isn't it > necessary to declare a as global within the gt function, as apposed to a case > like > > def gt2(l): > b=b+l > > where I need to declare b as global within the function to avoid: > > UnboundLocalError: local variable 'b' referenced before assignment.
Well. To understand the difference, one first has to know the mechanism of CPython. When you have a script, CPython will first parse it, and then generate bytecode representation, and then finally execute it. If you take a look at the bytecode of both your source code, you will notice, that. In the first snippet, there is something like LOAD_NAME, which loads the global name a. However, in the second snippet, there would be a LOAD_FAST, which loads the local name b (which is, technically speaking, stored in the PyFrameObj). The reason Python treats it differently, is, IIUC, for better semantic meaning, and also, for huge performance improvement. Hope that explains. Regards. -- Shiyao Ma http://introo.me -- https://mail.python.org/mailman/listinfo/python-list