$ echo 'A = 1; print("A1"); from b import A; print("A2")' > a.py
$ echo 'print("B1"); from a import A; print("B2"); A += 1' > b.py
$ python -c 'from a import A; print(A)'
A1
B1
B2
A2
2
I added several prints so that it's possible to tell what order code is executed, and changed import * to import A because I think it improves clarity without changing the behavior.
- The main program runs
- It encounters an import of
aso it starts executing the content ofa.pyin a newly createdamodule - It sets
A.a=1via the assignment statement ina.py - It encounters an import of
bso it starts executing the content ofb.pyin a newly createdbmodule - It sets
b.A=1byfrom...import - It adds 1 to
b.Aso thatb.Ais now equal to 2 - Execution reaches the end of
b.pyso it returns toa.py a.pysetsa.Ato 2 byfrom...import- Execution reaches the end of
a.pyso it returns to the main program. - The main program sets
__main__.Ato 2 byfrom ...import - The value of
Ais printed (2)