Sharing package data across files

scottpakin1 at gmail.com scottpakin1 at gmail.com
Tue Jun 28 20:02:18 EDT 2016


On Tuesday, June 28, 2016 at 5:20:16 PM UTC-6, John Pote wrote:
> Correct me if I'm wrong but is not the above only true if bar has been 
> assigned to and thus references an imutable object? In your example the 
> string "oranges".
> If bar has been assigned to a mutable object in module foo then every 
> module importing via "from foo import bar" will all import the name bar 
> pointing to the same mutable object. If this mutable obj is changed via 
> bar in one module then every other module importing bar will also see 
> the change.
> eg
> In module foo:
>      bar = ["apples","bananas","grapes"]
> 
> In module bar1
>      from foo import bar
>      bar[0] = "oranges"
> 
> In module barx at some later time
>      from foo import bar
>      ...
>      print bar    #prints ["oranges","bananas","grapes"]

That does seem to be the case.  Making my example look like the above, with foo being assigned a list and bar mutating the first element of the list, indeed results in foo being updated:

    >>> from example import foo, bar
    >>> foo
    ['apples', 'bananas', 'grapes']
    >>> bar()
    ['oranges', 'bananas', 'grapes']
    >>> foo
    ['oranges', 'bananas', 'grapes']

> If my understanding here is correct then this would be a good case for 
> never directly writing to a globle. Use getter()s and setter()s to make 
> it obvious that any use of the setter() will be seen by all future calls 
> to the getter().

Yeah, it looks like I'll have to do more to my original (big) code than simply partition it into appropriate-sized chunks and drop it into a package directory.  Oh, well.

Thanks,
-- Scott



More information about the Python-list mailing list