python 经验:把全局变量放在一个类中
注:红色是我增加的注释
add by zhj:其实python中的import, from-import语句是创建新的同名变量指向引入的模块和模块属性,这也就解释了下面的情况。
我们应尽量不用全局变量,比如当一个模块中的两个函数要用同一个变量时,我们可以尝试把这两个函数写在一个类中,而该变量定义
成类变量。如果非要用全局变量,建议把它们全部定义在一个类中,通过“类名.类变量名”来使用它们,这样OK了,根本不用什么globle
关键字了。
原文:http://www.2cto.com/kf/201307/227572.html
-- a.py --
PWD = None
def func1():
global PWD
PWD="pwd"
print "PWD in func1 is: " + PWD
-- b.py --
from a import * #创建新变量PWD,func1,它们与a.py模块中的变量PWD,func1属性不同的名称空间,指向相同的对象,其实变量就是指针
func1() #进入a.py模块的名称空间,修改a.py中PWD指针,指向新的对象
print "PWD after call func1() is: " + str(PWD) #a.py中PWD和b.py中的PWD是两个指针,指向同一个对象,a.py中的PWD指向了新的对象,这对b.py中的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 *" 否则你会发现不能对简单全局变量赋值
python 经验:把全局变量放在一个类中的更多相关文章
- pytest之将多个测试用例放在一个类中,生成唯一临时文件夹
将多个测试用例放在一个类中 简单来说就是将多个测试用例放到类中,通过pytest去管理,这和Testng很像.示例代码如下: """ 将多个测试用例放到一个类中执行 &q ...
- Java中是否可以调用一个类中的main方法?
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
- Java中的一个类怎么调用另一个类中的方法
如果另一个类中的那个方法是私有的话,就不能直接调用到,如果是其他类型的话看情况,如果是静态的(static)话,直接用类名可以调用到,如果是非静态的,就需要利用另一个类的实例(也就是用那个类生成的对象 ...
- C#判断一个类中有无"指定名称"的方法
C#中可以通过反射分析元数据来解决这个问题,示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...
- Java反射机制demo(五)—获得并调用一个类中的方法
Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...
- @selector 如何调用在另一个类中的静态函数?
可以在同一个类的methodName这个函数中再调用另一个类中的静态方法
- @Transactional-同一个类中方法自调,调用方法事物失效
问题分析 一个类中的方法调用另一个事物传播性为创建事物的方法,调用的方法事物失效? SpringAOP 代理的Service对象调用了其方法,这个方法再去调用这个Service中的其他方法是没有使用A ...
- selenium+python+unittest:一个类中只执行一次setUpClass和tearDownClass里面的内容(可解决重复打开浏览器和关闭浏览器,或重复登录等问题)
unittest框架是python自带的,所以直接import unittest即可,定义测试类时,父类是unittest.TestCase. 可实现执行测试前置条件.测试后置条件,对比预期结果和实际 ...
- Android反射出一个类中的其他类对象并调用其对应方法
MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Met ...
随机推荐
- async await yield
问题:async 和yield有什么区别? 无奈只能用“书到用时方恨少”来解释这个问题了.其实也是自己从开始编程就接触的是nodejs中的async 以及await ,yield几乎.貌似好像都没使用 ...
- java里面的getAttribute和findAttribute的区别
findAttribute: abstract Object findAttribute(String name) Searches for the named attribute in page, ...
- 解决安装laravel/homestead vagrant环境报"A VirtualBox machine with the name 'homestead' already exists."的错误
之前在mac上安装laravel/homestead vagrant虚拟机环境时由于参照的教程是: 每次都必须在~/Homestead目录下边运行vagrant up/halt命令,觉得实在是不方便, ...
- Get方法和post方法有何不同?
Get方法和post方法有何不同? 在B/S应用程序中,前台与后台的数据交互,都是通过HTML中Form表单完成的.Form提供了两种数据传输的方式——get和post.虽然它们都 是数据的提交方式, ...
- Androidの疑难杂症之加载布局报Error inflating class <unknown>
android.view.InflateException: Binary XML file line #12: Error inflating class <unknown> 出现这种错 ...
- thinkphp 多对多关联模型(转)
先建立一个模型 1 2 3 4 5 6 7 8 9 10 11 12 <?php class UserModel extends RelationModel{ protected $ ...
- 题目1091:棋盘游戏(DFS)
题目链接:http://ac.jobdu.com/problem.php?pid=1091 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- Sencha Touch 实战开发培训 视频教程 第二期 第六节
2014.4.18 晚上8:20左右开课. 本节课耗时没有超出一个小时. 本期培训一共八节,前两节免费,后面的课程需要付费才可以观看. 本节内容: 图片展示 利用list展示图片: 扩展Carouse ...
- 一个linux命令之grep---1
grep 表示“匹配” 参数常用的四个 -i 匹配的文件内容忽略大小写 -R 递归的匹配文件(即在一层一层的目录中的文件中去匹配) -n 表示匹配出的行显示在文件中的行号 -H ...
- HTTP协议详解(真的很经典)(转载)
HTTP协议详解(真的很经典):http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html 引言 HTTP是一个属于应用层的面向对象的协 ...