python 经验: from x import * 影响全局变量使用
2013-07-12 10:05
513 查看
最近写 python 程序, 发现一个比较 trick 的地方
a.py
b.py
刚开始我认为在函数中给全局变量的赋予的值, 并不能传递回去, 就是说
global PWD 只是把全局变量的传递给局部变量 PWD, 而后用户都在对局部变量 PWD进行操作, 但并不是这样
看下面例子, 只是改了 import 语句
------------------------- b.py ------------------------
输出变为
PWD in func1 is: pwd
PWD after call func1() is: pwd
因此我推测 global 只能改本 module ( 此 py 文件 ) 中的全局变量
a.py 增加一个函数
------------------------- a.py ------------------------
------------------------- b.py ------------------------
输出结果为
PWD in func1 is: pwd
PWD in func2 is: pwd
貌似我的结论成立:
global 只能改本 module ( 此 py 文件 ) 中的全局变量
但如果全局变量是 list 或 dict 类型, 就没有问题
------------------------- a.py ------------------------
------------------------- b.py ------------------------
运行 python b.py , 打印
glist changed
-- b.py -- 甚至可以不用 global GLIST
这就好比虽然 GLIST只读, 但它的仿佛是个指针, 指向的位置却可写
结论:
最好不要使用 "from a import *" 否则对对全局变量赋值在其他module中不能使用. ( 最好用 import a, 在其他 module 通过 a.gvar 使用)
另外值得一提的是: 如果只是读取全局变量( 不修改), 并不需要用 global 再申明, 直接使用就可以了
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 再申明, 直接使用就可以了
相关文章推荐
- python多文件使用同一个全局变量的定义和使用方法
- python中必须使用global声明全局变量的情况
- python unittest TestCase间共享数据(全局变量的使用)
- Python中import与from……import的使用
- python全局变量使用注意事项_
- python全局变量的使用
- python3 动态模块导入与全局变量使用
- [Python]全局变量的语法及使用
- python-remote SDK 多层目录的import,subprocess的使用就idea中环境变量
- python中import或from使用及模块和包的使用总结
- 尽量避免使用全局变量,以防与其它函数重名影响运行结果
- Python: 全局变量 & 局部变量的使用
- python变量总结: 全局变量、局部变量、类变量、实例变量以及global和nonlocal关键字的使用示例
- python全局变量的使用错误
- python zeros()使用(from numpy import *)
- Python 3 实现定义跨模块的全局变量和使用
- python变量之全局变量与局部变量的使用
- python全局变量使用
- python 的全局变量global变量使用
- Python 之 使用全局变量