跨模块全局变量的使用问题

一. 使用 from p import *  会影响全局变量使用

a.py 文件

PWD = None
 
 
def func1():
    global PWD
    PWD="pwd"
    print "PWD in func1 is: " + PWD

p.py 文件

from a import *
func1()
print "PWD after call func1() is: " + str(PWD)

执行p.py文件

执行 python b.py 结果如下
PWD in func1 is: pwd
PWD after call func1() is: None

上述结论:认为在函数中给全局变量的赋予的值, 并不能传递回去, 就是说global PWD 只是把全局变量的传递给局部变量 PWD,全局变量还是没有改变。外部模块文件调用还是使用没有改变的值。global 只能改本 module ( 此 py 文件 ) 中的全局变量

再次举例:

a.py 增加一个函数

-------------------------  a.py ------------------------

PWD = None
 
def func1():
    global PWD
    PWD="pwd"
    print "PWD in func1 is: " + PWD
 
 
def func2():
    global PWD
    print "PWD in func2 is: " + PWD

-------------------------   b.py ------------------------

from a import *
 
print dir()
func1()
func2()

输出结果为

PWD in func1 is: pwd
PWD in func2 is: pwd

-------------------------------------------------------------------------------------------------------

但如果全局变量是 list 或 dict 类型, 就没有问题

-------------------------  a.py ------------------------

GLIST = ["glist"]
 
def func1():
    global GLIST
    GLIST[0] = "glist changed"

-------------------------   b.py ------------------------

from a import *
 
print GLIST[0]

运行  python b.py , 打印

glist changed

 

-- b.py -- 甚至可以不用 global GLIST

def func1():
    GLIST[0] = "glist changed"

这就好比虽然 GLIST只读, 但它的仿佛是个指针, 指向的位置却可写

结论: 

最好不要使用 "from a import *" 否则对对全局变量赋值在其他module中不能使用. ( 最好用 import a, 在其他 module 通过 a.gvar 使用)

另外值得一提的是: 如果只是读取全局变量( 不修改), 并不需要用 global 再申明, 直接使用就可以了

 

  1. def func1():
  2.  
    GLIST[0] = "glist changed"
posted @ 2020-05-16 13:29  cool小伙  阅读(994)  评论(0编辑  收藏  举报