Import Python module behavior

Can anyone explain this behavior?

A.py:

import B
values = []

if __name__=="__main__":
    values.append('something')
    print values
    B.printValues()

B.py:

import A

def printValues():
    print A.values

Result:

['something']
[]

I expected:

['something']
['something']
+4
source share
3 answers

Here's what happens:

  • Aimport B. This leads to code execution in B:
    • Ais imported. Since this is the first time it is imported A( Anot located in sys.modules), all the code in is executed A.
      • Performed
      • import B. This does not execute code in B, because it is Balready in sys.modules.
      • An empty list is created values.
      • the block if __name__=='__main__'is not executed , leaving valuesblank.
    • B A , . , import __main__; print __main__ is A B. False.
+2

, , A, , , , A, sys.modules. , A , , . C, , B-C - B C A.

A.py

import sys
print len(sys.modules), "len(sys.modules):A top"
import B, C
print len(sys.modules), "len(sys.modules):A after import B, C"

values = []


if __name__=="__main__":
    values.append('something')
    print "A:", values, 'id:',id(values)
    B.printValues()
    C.printValues()

B.py

import sys
print len(sys.modules), "len(sys.modules):B top"
import A
print len(sys.modules), "len(sys.modules):C after A import"

def printValues():
    print "B:", A.values, "id:", id(A.values)

C.py

import sys
print len(sys.modules), "len(sys.modules):C top"
import A
print len(sys.modules), "len(sys.modules):C after A import"

def printValues():
    print "C:", A.values, "id:", id(A.values)    

:

 42 len(sys.modules):A top
 43 len(sys.modules):B top
 44 len(sys.modules):A top
 45 len(sys.modules):C top
 45 len(sys.modules):C after A import
 45 len(sys.modules):A after import B, C
 45 len(sys.modules):C after A import
 45 len(sys.modules):A after import B, C
 A: ['something'] id: 4493313232
 B: [] id: 4493269616
 C: [] id: 4493269616               
+1

, .

print , .

A.py

print("before import B")
import B
print("start execute A as " + __name__)

values = []

if __name__=="__main__":
    values.append('something')
    print "values=" + str(values)
    B.printValues()
    B.appendValue("hello")
    B.printValues()
    print "values=" + str(values)

print("finished execute A as " + __name__)

B.py

print("start runnig B")
import A

def printValues():
    print "A.values=" + str(A.values)

def appendValue(new_value):
    A.values.append(new_value)

print "A.values=" + str(A.values)

print("finish running B")

before import B
start runnig B
before import B
start execute A as A
finished execute A as A
A.values=[]
finish running B
start execute A as __main__
values=['something']
A.values=[]
A.values=['hello']
values=['something']
finished execute A as __main__

A.values, B.py, . A.py values. __name__.

0
source

All Articles