注:红色是我增加的注释

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 经验:把全局变量放在一个类中的更多相关文章

  1. pytest之将多个测试用例放在一个类中,生成唯一临时文件夹

    将多个测试用例放在一个类中 简单来说就是将多个测试用例放到类中,通过pytest去管理,这和Testng很像.示例代码如下: """ 将多个测试用例放到一个类中执行 &q ...

  2. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

  3. Java中的一个类怎么调用另一个类中的方法

    如果另一个类中的那个方法是私有的话,就不能直接调用到,如果是其他类型的话看情况,如果是静态的(static)话,直接用类名可以调用到,如果是非静态的,就需要利用另一个类的实例(也就是用那个类生成的对象 ...

  4. 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 ...

  5. Java反射机制demo(五)—获得并调用一个类中的方法

    Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...

  6. @selector 如何调用在另一个类中的静态函数?

    可以在同一个类的methodName这个函数中再调用另一个类中的静态方法

  7. @Transactional-同一个类中方法自调,调用方法事物失效

    问题分析 一个类中的方法调用另一个事物传播性为创建事物的方法,调用的方法事物失效? SpringAOP 代理的Service对象调用了其方法,这个方法再去调用这个Service中的其他方法是没有使用A ...

  8. selenium+python+unittest:一个类中只执行一次setUpClass和tearDownClass里面的内容(可解决重复打开浏览器和关闭浏览器,或重复登录等问题)

    unittest框架是python自带的,所以直接import unittest即可,定义测试类时,父类是unittest.TestCase. 可实现执行测试前置条件.测试后置条件,对比预期结果和实际 ...

  9. Android反射出一个类中的其他类对象并调用其对应方法

    MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Met ...

随机推荐

  1. Kafka Java consumer动态修改topic订阅

    前段时间在Kafka QQ群中有人问及此事——关于Java consumer如何动态修改topic订阅的问题.仔细一想才发现这的确是个好问题,因为如果简单地在另一个线程中直接持有consumer实例然 ...

  2. mybayis 之resultType="map"

    List<Map> publishInfos = memberShareMapper.shareToCouponCountGroupByPublishId(memberShare.getA ...

  3. UITableView+FDTemplateLayoutCell源码学习笔记

    本文转载至  http://www.cocoachina.com/bbs/read.php?tid=299773 基本原理是通过缓存每个cell的高度,当tableview回调delegate的hei ...

  4. MD5加密与base64编码

    转自:http://blog.csdn.net/sxzlc/article/details/74127268 import java.io.UnsupportedEncodingException; ...

  5. Servlet基本用法(一)基本配置

    一.前言 Java Servlet是一个基于Java技术的Web组件,运行在服务器端,由Servlet容器所管理,用于生成动态的内容.Servlet是平台独立的Java类,编写一个Servlet实际上 ...

  6. Git学习(一)(2015年11月12日)

    环境:win10 已安装git工具(如未配置环境变量需先配置环境变量) 如何配置环境变量:.我的电脑-属性-高级系统设置-环境变量-系统变量 找到path然后在变量值结尾增加路径: ;C:\Progr ...

  7. WP8.1学习系列(第三章)——磁贴和锁屏通知

    一.创建默认磁贴 创建默认磁贴,不需要任何代码只有制作几张图片就可以了. 1.创建工程之后,在工程目录找到package.appxmanifest,打开它. 2.在应用程序栏,通知选项,选择徽章和图块 ...

  8. Python基础---->python的使用(二)

    学习一下python,这里对python的基础知识做一个整理.似等了一百年忽而明白,即使再见面,成熟地表演,不如不见. python的一些应用 一.类似于java中的MessageFormat用法 w ...

  9. 通过orderby关键字,LINQ可以实现升序和降序排序。LINQ还支持次要排序。

    通过orderby关键字,LINQ可以实现升序和降序排序.LINQ还支持次要排序. LINQ默认的排序是升序排序,如果你想使用降序排序,就要使用descending关键字. static void M ...

  10. Python Extension Packages 下载

    Python Extension Packages下载 这个下载源资源丰富,python支持版本从2.x到3.7,从win32到win64位都有支持,是非常好资源. 特别留下记号备查. Index b ...