注:红色是我增加的注释

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. CentOS7--TigerVNC

    --安装服务yum install tigervnc-server -y --配置文件,多个用户就拷贝多个cp /lib/systemd/system/vncserver@.service /etc/ ...

  2. [Vim] 搜索模式(正则表达式)

    本文介绍如何使用Vim的搜索模式. 搜索单词 Vim中使用 \< 和 \> 分别表示单词的开头和结尾,例如查找单词 i 而不是字母 i ,在正常模式下,按下 / 启动搜索模式,输入 \&l ...

  3. Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LTS)

    为什么要用vim编辑py文件? 因为在Linux命令行中,缺少图形界面的IDE,vim是最佳的文本编辑器,而为了更好的编辑py文本,所以配置vim. 1. 安装完整版vim vi和vim的区别? 在L ...

  4. 从经典问题来看 Copy 方法

    经典面试题:为什么 NSString 类型成员变量的修饰属性用 copy 而不是 strong (或 retain ) ? 在初学 iOS 的时候,可能会被灌输这么一个常识,切记 NSString 的 ...

  5. angular-file-upload+struts的使用

    参考帖子 http://www.cnblogs.com/wangzun/p/6099884.html http://www.cnblogs.com/highriver/archive/2011/06/ ...

  6. 《转》python学习(12)-列表解析

    转自 http://www.cnblogs.com/BeginMan/p/3164937.html 一.列表解析 列表解析来自函数式编程语言(haskell),语法如下: [expr for iter ...

  7. Linux调试分析诊断利器——strace

    strace是个功能强大的Linux调试分析诊断工具,可用于跟踪程序执行时进程系统调用(system call)和所接收的信号,尤其是针对源码不可读或源码无法再编译的程序. 在Linux系统中,用户程 ...

  8. vue笔记 - 生命周期第二次学习与理解

    对于刚接触vue一两个月.才仅仅独立做过一两个vue项目的小白来说,以前一直自我感觉自己知道vue的生命周期, 直到前两天去面试,面试官让我说一下vue的生命周期... 其实我的心中是有那张图的,但是 ...

  9. css3整理--text-overflow

    text-overflow语法: text-overflow : clip | ellipsis clip:表示不显示省略标记(...),而只是简单的裁切,需要在一定的高度范围内配合overflow: ...

  10. Android studio 插件安装

    安装插件步骤 一 CodeGlance 最大的用途:可用于快速定位代码.显示在右侧 二 Android Studio Prettify 可以将代码中的字符串写在string.xml文件中 选中字符串鼠 ...