问题
This is test.py:
import sys
a = 50
b = [1,2]
def change():
print "Here 1"
import test
print "Here 2"
test.a = -1
test.b = [0,1]
return
def main():
print "Here 3"
change()
print "Here 4"
print a, b
if 1:
main()
The above python code when ran on system generates the following output:
Here 3
Here 1
Here 3
Here 1
Here 2
Here 4
-1 [0, 1]
Here 2
Here 4
50 [1, 2]
What I am confused why is not there an infinite loop of "Here 1 \n Here 3" outputs. How can the print a, b outputs can be justified?
回答1:
When you run the file as a script, it is not considered to be the test
module. It is considered to be the __main__
module.
When execution hits import test
, a second execution of the file starts, where the module is considered to be test
.
When execution hits import test
again, Python recognizes that it's already importing test
and does not reexecute the module. Instead, it merely loads the half-initialized test
module object into the current namespace and continues on. Python's optimistic assumption is that you've written the code so that the contents of test
won't be needed until the import finishes.
When execution hits the assignments to test.a
and test.b
, that affects the test
module, but not __main__
, despite the fact that they came from the same file. Thus, the print a, b
from the imported module reflects the new values, while the print a, b
from __main__
reflects the initial values.
回答2:
A file can only be imported once. The 'import test' line succeeds the first time it is encountered. When it is encountered a second time, the interpreter will check that it has already been loaded.
When a program is initially run, it does not count as being 'imported'.
回答3:
The general flow of this script is as follows:
- Main is run, so it prints 'Here 3'
- change is called, so it prints 'Here 1'
- When importing test, python runs the main function of test
- When calling change the second time, python is smart enough to know that test is already imported, so it effectively skips that line.
- The imported main finishes running
- The original script finishes running.
回答4:
While user2367112's excellent answer explains why this happens, none of the answers here offer a workaround.
There are two easy ways to achieve the desired behavior.
- Rather than importing
test
, useimport __main__
instead. If you assign an alias withimport __main__ as test
, you won't even have to change any other code. - You can set
sys.modules['test'] = sys.modules['__main__']
to tell python "Hey, this module already exists". After this,import test
will not re-import the module, thus making your code work as expected. The relevant docs onsys.modules
can be found here.
来源:https://stackoverflow.com/questions/21326245/importing-a-py-file-within-itself