您的位置:首页 > 编程语言 > Python开发

python 经验: from x import * 影响全局变量使用

2013-07-12 10:05 513 查看
最近写 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

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

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


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

结论:

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

另外值得一提的是: 如果只是读取全局变量( 不修改), 并不需要用 global 再申明, 直接使用就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: