首先看一段代码:

A = 0
B = [0] def fun1(A, B):
A += 1
B[0] += 1
fun1(A, B)
print 'after fun1 %d %s' % (A,B) def fun2():
global A
A += 1
B[0] += 1
fun2()
print 'after fun2 %d %s' % (A,B)

执行后的结果:

after fun1 0 [1]
after fun2 1 [2]

fun1中,A作为基本类型(int)是值传递,B不是基本类型(list)则是引用传递,所以执行后全局的A未变但B变了;

(如果熟悉C++就很容易理解,类似的概念:指针、引用、深拷贝、浅拷贝等)

(注意,与C++不同,Python中字符串str为基本类型)

fun2中,使用Python的关键字global才可以在函数内操作全局变量A,但B不需要global却能直接使用,这样可以避免一些“自以为是”的逻辑错误;

(注意,如果仅仅访问而不修改,在函数内是可以不用global直接使用的,比如在fun2中只是print A)

有了上面的理解后,我们来分析下在Python中怎么用全局变量好:

首先,使用基本类型的全局变量需要在每个操作它的函数、类里面用global声明还是挺麻烦的;

列表或元组呢,访问的时候用数字索引会降低代码的可读性;

用字典(dict)则可以解决上面两个问题,在简单的程序中dict应该是很合适的;

但是,在复杂的代码中如果需要对全局变量的修改进行一定的控制,或者在多组多个线程每组共享同类型但不同值的全局变量时,dict就无法胜任;

综上,个人认为自定义一个类来保存所有的全局变量是最好的方法:

  简单时就直接访问成员变量;

  需要控制时就声明为私有变量,用成员函数访问和修改;

  多组多线程分开共享时就每组new一个新实例即可;

示例一:

#common.py
class MyGlobal:
def __init__(self):
self.A = 0
self.B = [0]
GL = MyGlobal() #main.py
from common import *
def fun():
GL.A += 1
GL.B[0] += 1
fun()
print 'after fun %d %s' % (GL.A,GL.B) #执行./main.py
after fun 1 [1]

示例二:

#common.py
import threading
class MyGlobal:
def __init__(self, i, setname):
self.setname = setname
self.A = i
self.B = [i] #main.py
from common import *
def fun_trd(gl):
print '%s %d %s' % (gl.setname,gl.A,gl.B)
#两组,每组三个线程
trds = []
for i in range(0,2):
setname = 'SET%d' % i
gl = MyGlobal(i, setname)
for k in range(0,3):
t = threading.Thread(target=fun_trd, args=(gl,))
t.setDaemon(True)
t.start()
trds.append(t)
for t in trds:
t.join() #执行./main.py
SET0 0 [0]
SET0 0 [0]
SET0 0 [0]
SET1 1 [1]
SET1 1 [1]
SET1 1 [1]

over

讨论下python中全局变量的使用的更多相关文章

  1. python中全局变量和局部变量的一个小坑

    python 中全局变量和局部变量在使用过程中的一个容易出错的地方 什么是全局变量 python中,在函数外部声明的变量可以叫做全局变量. x = 10 def fn1(): pass fn1() 什 ...

  2. Python 中全局变量的实现

    一.概述 Python 中全局变量的使用场景不多,但偶尔也有用武之处. 如在函数中的初始化,有时需要从外部传入一个全局变量加以控制.或者在函数中,使用连接池时,也可能有使用全局变量的需要. 广义上的全 ...

  3. 简单介绍下python中函数的基础语法

    python 函数 定义 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 特性 减少代码重复 使程序变得可扩展 使程序变得易于维护 函数的创建 pyt ...

  4. centos下python中添加easygui模块

    前提:python中要集成Tkinter,Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同 ...

  5. python中全局变量的使用

    python中在module定义的变量可以认为是全局变量, 而对于全局变量的赋值有个地方需要注意. test.py ------------------------------------------ ...

  6. python 1: 解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题

    问题: 我在ubuntu14.04下用python中的matplotlib模块内的pyplot输出图片不能显示中文,怎么解决呢? 解决: 1.指定默认编码为UTF-8: 在python代码开头加入如下 ...

  7. Python中全局变量的引用与修改之格式影响

    先来看下面的代码及执行结果: a = 1 b = [2,3] def nums(): a = 2 b[0] = 0 print(a) print(b) print(a) print(b) nums() ...

  8. Windows下Python中pip安装Pillow报错总结(转载)

    遇到的俩种错误1.ValueError: zlib is required unless explicitly disabled using --disable-zlib, aborting 问题原因 ...

  9. Windows下Python中的中文路径和中文输出问题

    这几天有个项目需要写一点类似于脚本的小程序,就用Python写了,涉及到中文路径和中文输出的问题,整理一下. 有一个问题我觉得需要先强调一下,在写Python程序的时候,一定保证编码是utf-8,然后 ...

随机推荐

  1. Adobe Acrobat 9 Pro序列号

    其实只删除c:\Program Files\Common Files\Adobe\Adobe PCD\cache目录下的cache.db文件也是可以的,然后重新打开Adobe ,输入序列号1118-4 ...

  2. 一个简单的sel server 函数的自定义

    创建自定义函数:use 数据库名gocreate function 函数名(@pno int)returns intasbegin  declare @a int   if not exists(se ...

  3. npm发布包--所遇到的问题

    npm发布包: 解决方案--npm adduser的坑:http://www.tuicool.com/articles/FZbYve npm ERR publish 403,nodejs发布包流程 : ...

  4. iOS 正则表达式(一)

    在iOS开发中,正则一直是最常用的,但也是一直记不住的,现在做一些简单的总结 我们在网上找的正则,要有'\',这个在iOS是转义符,需要'\\'这样 int main(int argc, const ...

  5. tp命名空间

    namespace   Home\Controller;  命名空间   根命名空间下的类所在的文件夹use Think\Controller; 使用   根命名空间下的controller类 顶头写 ...

  6. Yii2 Restful api分页

  7. 网关绑定命令,解决arp攻击

    一般家里的宽带都采用ADSL设备,通过固定IP地址接入Internet,但是经常会出现断网的现象,那么如何通过ARP命令绑定默认网关来解决这个问题呢? 工具/原料 ARP命令 CMD命令提示符 方法/ ...

  8. python csv文件转换成xml, 构建新xml文件

    csv文件 code from xml.etree.ElementTree import Element,ElementTree,tostring import json,csv def csvtox ...

  9. python os.path.splitext()

    # Split the file extension 可以把扩展名获取出来

  10. ElasticSearch相关文章推荐

    1. ElasticSearch查询:http://www.cnblogs.com/ljhdo/p/4486978.html 2. Elasticsearch Java API 的使用—多条件查询:h ...