One sentence rule: the reference of a variable is visible to all its lower levels, thus mutable variables are visible and able to be modified in the lower levels, immutable variables are visible in the lower levels, but not able to be modified since the modification will create a local variable instead of modify the variable in the upper levels
#!/usr/bin/python n = 10; #global variables def f(): m = 100; print dir(); # ['m'] print globals(); # ['f', '__builtins__', '__file__', 'n', '__name__', '__main__', '__package__', '__doc__'] print locals(); {'m': 100} print dir(); # ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'f', 'n'] f();
#!/usr/bin/python n = 10 # global variable print id(n), n # access local variable def f1(): n = 1; print id(n), n; # access variable in enclosing function def f2(): n = 2; def f3(): print id(n), n; f3(); # access global variable def f4(): def f5(): print id(n), n; f5(); f1(); f2(); f4();
a = 10 # global variable print id(a), a # 27193472, 10 def f1(): # global variable is visible to the lower level # globals: {'a': 10, ...} print id(a), a # 27193472, 10 def f2(): # create a local variable, which screens the global variable # globals: {'a': 10, ...} a = 100 # locals: {'a': 100} print id(a), a # 27195296 100 f1() f2() print id(a), a # 27193472, 10
l = range(10) # global variable print id(l), l # 140678046472600, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] def f3(): # the reference of the gocal variable is visible to the lower level print id(l), l # 140678046472600, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] def f4(): # modify an element of the global variable l[1] = 100 print id(l), l # 140678046472600, [0, 100, 2, 3, 4, 5, 6, 7, 8, 9] f3() f4() print id(l), l # 140678046472600, [0, 100, 2, 3, 4, 5, 6, 7, 8, 9] def f5(): # create a local variable, which screens the global variable l = [1, 2, 3, 4] print id(l), l # 139718240373432, [1, 2, 3, 4] f5() print id(l), l # 140678046472600, [0, 100, 2, 3, 4, 5, 6, 7, 8, 9]
t = 10 print id(t), t # 140417416870688, 10 def f8(): global t # t is a global variable print id(t), t #140417416870688, 10 t = 100 # modify the global variable t print id(t), t #140249594380832, 100 print 'globals: ', globals() # globals: {'t': 100} print 'locals: ', locals() # locals: {} f8() print id(t), t # 140249594380832, 100
#!/usr/bin/pyhton def f(): import math; # import math in local namespace print math.pi; f(); print math.pi; # not import math error
# m1.py a = 10
# m2.py import m1 print m1.a