首先看一段代码:

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. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(十)使用JRTPLIB传输RTP数据

    myRtspClient通过简单修改JRTPLIB的官方例程作为其RTP传输层实现.因为JRTPLIB使用的是CMAKE编译工具,这就是为什么编译myRtspClient时需要预装CMAKE. 该部分 ...

  2. node服务开发环境判断和启动端口指定---process.env.NODE_ENV

    在node启动的时候我们需要在代码里面判断服务器运行环境 可以根据process.env.NODE_ENV来判断 一.开发环境的判断 1.安装 npm i -g cross-env 2.启动 cros ...

  3. 基于jquery ajax的多文件上传进度条

    效果图 前端代码,基于jquery <!DOCTYPE html> <html> <head> <title>主页</title> < ...

  4. svn回复历史版本的操作方法

    svn恢复历史版本的操作方法svn update 保证最新svn log login.php 获得版本号svn diff -r 11026:11027 login.php 发现11027出问题svn ...

  5. C#中换行的代码

    1.Windows 中的换行符"\r\n"2.Unix/Linux 平台换行符是 "\n".3.MessageBox.Show() 的换行符为 "\n ...

  6. RocketMQ的使用

    1 在resources目录下创建config目录,新建文件rocketmq.properties文件 # 指定namesrv地址 suning.rocketmq.namesrvAddr=localh ...

  7. <1>Cocos Creator安装和启动

    学习之间需要了解JavaScritp基本语法和面向对象,详情参考https://blog.csdn.net/jadeshu/article/category/7476938 1.下载Cocos Cre ...

  8. 使用js Math.random()函数生成n到m间的随机数字

    何使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备,Math.random()函数返回0和1之间的伪随机数   摘要: 本文讲解如何使用js生成n到m间的随机数字,主要目的是为后 ...

  9. web.config 特殊字符转义

    字符 转义码 & 符号 & & 单引号 ' &apos; 双引号 " " 大于 > > 小于 < <

  10. 仿豆瓣网(电脑版网页)HTML+CSS实现

    步骤一:将豆瓣电脑版网页以图片形式保存下来: 利用了chrome里面的插件: 步骤二:将图片放置到PS中,研究布局: 我将其分为header部分,banner部分,section部分,footer部分 ...