Variables with cross-module usage

Matt Nordhoff mnordhoff at mattnordhoff.com
Sat Nov 28 23:57:09 CET 2009


Rami Chowdhury wrote:
> Hi Nitin,
> 
> On Sat, Nov 28, 2009 at 14:36, MRAB <python at mrabarnett.plus.com> wrote:
>> Nitin Changlani. wrote:
>>> three.py
>>> ------------
>>> import one
>>> import two
>>>
>>> def argFunc():
>>>    one.x = 'place_no_x'
>>>    one.a = 'place_no_a'
>>>    one.b = 'place_no_b'
>>>
> 
> I think this is what is biting you. You might expect that after
> argFunc, one.x would be set to 'place_no_x' and so on. However,
> Python's scoping doesn't work like that -- the name one.x is only
> rebound in the function's scope, so outside of argFunc (e.g. in your
> main printing code) one.x is still bound to 'place_x'.
> 
> HTH,
> Rami

Not true. argFunc does not rebind the name "one", it mutates the module
object referred to by the name "one". Since there is only one instance
of a given module*, the change is indeed reflected everywhere the "one"
module is accessed.

The problem is that argFunc does not modify (or replace) one.myList, as
MRAB said.

* Unless you do something strange like reload() or editing sys.modules
or having module available under different names...or something.
-- 
Matt Nordhoff



More information about the Python-list mailing list