Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #4554
| References | <d8d1d20e-2edd-49e5-917c-f338ef35006f@l18g2000yql.googlegroups.com> |
|---|---|
| Date | 2011-05-03 09:57 -0700 |
| Subject | Re: Why do directly imported variables behave differently than those attached to imported module? |
| From | Chris Rebert <clp2@rebertia.com> |
| Newsgroups | comp.lang.python |
| Message-ID | <mailman.1114.1304441878.9059.python-list@python.org> (permalink) |
On Tue, May 3, 2011 at 9:31 AM, Dun Peal <dunpealer@gmail.com> wrote: > Hi! > > Here's the demonstrating code: > > # module foo.py > var = 0 > > def set(): > global var > var = 1 > > Script using this module: > > import foo > from foo import * > > print var, foo.var > set() > print var, foo.var > > Script output: > > 0 0 > 0 1 > > Apparently, the `var` we imported from `foo` never got set, but > `foo.var` on the imported `foo` - did. Why? Because imports (and assignments generally) bind names to values, they don't alias names to other names. from foo import * can be thought of as essentially doing: import foo set = foo.set var = foo.var del foo So the new, separate name __main__.var gets the current value of foo.var at import-time, which is the integer 0. You then call foo.set(), which re-binds foo.var to a new value (i.e. 1) rather than mutating the existing value (which would be impossible anyway since integers are immutable). This has absolutely no effect on __main__.var, which is an entirely separate binding. The behavior is comparable to that of function arguments. Values can be mutated, but re-binding names has only local effect: >>> a = 0 >>> def incr(b): ... b = 1 # rebinds local name b ... >>> incr(a) >>> a # outside name unaffected, just like in your example 0 >>> c = [7] >>> def mutate_then_rebind(b): ... b.append(99) # mutates passed-in value ... b = [42] # rebinds local name; has no outside effect ... >>> mutate_then_rebind(c) >>> c # name still references same obj, but that obj has been mutated [7, 99] Cheers, Chris -- http://rebertia.com
Back to comp.lang.python | Previous | Next — Previous in thread | Next in thread | Find similar
Why do directly imported variables behave differently than those attached to imported module? Dun Peal <dunpealer@gmail.com> - 2011-05-03 09:31 -0700
Re: Why do directly imported variables behave differently than those attached to imported module? Chris Rebert <clp2@rebertia.com> - 2011-05-03 09:57 -0700
Re: Why do directly imported variables behave differently than those attached to imported module? Daniel Kluev <dan.kluev@gmail.com> - 2011-05-04 03:57 +1100
Re: Why do directly imported variables behave differently than those attached to imported module? Mel <mwilson@the-wire.com> - 2011-05-03 13:00 -0400
Re: Why do directly imported variables behave differently than those attached to imported module? Terry Reedy <tjreedy@udel.edu> - 2011-05-03 13:13 -0400
Re: Why do directly imported variables behave differently than those attached to imported module? harrismh777 <harrismh777@charter.net> - 2011-05-03 12:24 -0500
Re: Why do directly imported variables behave differently than those attached to imported module? Dun Peal <dunpealer@gmail.com> - 2011-05-03 11:51 -0700
Re: Why do directly imported variables behave differently than those attached to imported module? Dun Peal <dunpealer@gmail.com> - 2011-05-03 12:23 -0700
Re: Why do directly imported variables behave differently than those attached to imported module? Daniel Kluev <dan.kluev@gmail.com> - 2011-05-04 06:55 +1100
Re: Why do directly imported variables behave differently than those attached to imported module? Chris Angelico <rosuav@gmail.com> - 2011-05-04 07:47 +1000
Re: Why do directly imported variables behave differently than those attached to imported module? Duncan Booth <duncan.booth@invalid.invalid> - 2011-05-04 08:44 +0000
Re: Why do directly imported variables behave differently than those attached to imported module? Chris Rebert <clp2@rebertia.com> - 2011-05-03 15:11 -0700
csiph-web