python 经验:不要在函数中给简单全局变量赋值,如果你使用from a import *


最近写 python 程序, 发现一个比较 trick 的地方

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


PWD = None


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

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


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

执行 python b.py 结果如下

PWD in func1 is: pwd
PWD after call func1() is: None

 

 

刚开始我认为在函数中给全局变量的赋予的值, 并不能传递回去, 就是说


global PWD 只是把全局变量的传递给局部变量 PWD, 而后用户都在对局部变量 PWD进行操作, 但并不是这样

 

看下面例子, 只是改了 import 语句


-------------------------   b.py ------------------------
import a


a.func1()


print "PWD after call func1() is: " + str(a.PWD)

 

 

输出变为

PWD in func1 is: pwd
PWD after call func1() is: 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

 

 

貌似我的结论成立:

   global 只能改本 module ( 此 py 文件 ) 中的全局变量

 

 

 但如果全局变量是 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

 

 

结论:

最好不要使用 "from a import *" 否则你会发现不能对简单全局变量赋值

 

相关内容

    暂无相关文章

评论关闭