== How '_from module import ..._' is not doing what you may expect There are a number of reasons to avoid things like '_from module import *_'; for instance, [[it can be confusing later on UseModuleNamespaces]] and [[you can import more than you expect ImportAllImportsAll]]. But if you're doing this in the context of, say, [[just splitting a big source file apart SplittingProgramProblems]] it's tempting to say that these are not really problems. You're not going to be confused about where things come from because you're only importing everything from your own source files (and you're not even thinking of them as modules), and it's perfectly okay for there to be namespace contamination because that's kind of the point. But even then there are traps, because '_from module import ..._' is not really doing what you might think it's doing. There's two possible misconceptions here. If you're doing '_from module import *_' within your own code, often what you want is for there to be one conjoined namespace where everything lives, both stuff from the other 'module' (really just a file) and stuff from your 'module' (the current file). If you're doing '_from module import A_', it's easy (and tempting) to think that when you write plain _A_ in your code, Python is basically automatically rewriting it to really be '_module.A_' for you. Neither is what is actually going on in Python, although things can often look like it. What a '_from module_' import really does is ~~it copies things from one module namespace into another~~. More specifically it copies [[the current bindings of names WhatVariablesMean]]. You can think of '_from module import *_' as doing something roughly like this: .pn prewrap on > import module > _this = globals() > for n in dir(module): > _this[n] = getattr(module, n) > > del _this > del module (This code does not avoid internal names, doesn't respect ((__all__)), and so on. It's a conceptual illustration.) There are still two completely separate module namespaces, yours and the namespace of _module_; you have just copied a bunch of things from the _module_ namespace into yours under the same name (or just some things, if you're doing '_from module import A, B_'). Functions and classes from _module_ are still using their module namespace, even if a reference to some or all of them has been copied into your module. (As a corollary to this, things from _module_ mostly can't refer to anything from your module namespace. This is easy to see since you can't have circular imports; if you're importing _module_ to get at its namespace, it can't be importing you to get at yours. (Yes, there are odd ways around this.)) One reason why this matter is that if functions or classes from _module_ update stuff in their module namespace, you may or may not pick it up in your own module. For example, consider the following code in some other module: > gvar = 10 > > func setit(newval): > global gvar > gvar = newval The _gvar_ that you see in your own module will forever be '_10_', no matter what calls to _setit()_ have been made. However, code in the other module will see a different value for _gvar_. Not all sorts of updates will do this, of course. If _gvar_ is a dictionary and code just adds, changes, and deletes keys in it, everyone will see the same _gvar_. The illusion of a shared namespace can hold up, but it is ultimately only an illusion and it can be fragile. (And unless you already know Python well, it isn't necessarily easy to see where and when it's going to break down.) === Sidebar: An additional bit of possible weirdness There are some situations where a module's namespace is more or less overwritten wholesale; the obvious case is _reload()_ of the module. If you _reload()_ a module that has been the subject of '_from module import ..._', all of those bare imports are now broken, or at least not updated themselves. You can get into very odd situations this way ([[especially considering what reloading a module really does ReloadRealBehavior]]).