讨论下python中全局变量的使用
首先看一段代码:
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中全局变量的使用的更多相关文章
- python中全局变量和局部变量的一个小坑
python 中全局变量和局部变量在使用过程中的一个容易出错的地方 什么是全局变量 python中,在函数外部声明的变量可以叫做全局变量. x = 10 def fn1(): pass fn1() 什 ...
- Python 中全局变量的实现
一.概述 Python 中全局变量的使用场景不多,但偶尔也有用武之处. 如在函数中的初始化,有时需要从外部传入一个全局变量加以控制.或者在函数中,使用连接池时,也可能有使用全局变量的需要. 广义上的全 ...
- 简单介绍下python中函数的基础语法
python 函数 定义 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 特性 减少代码重复 使程序变得可扩展 使程序变得易于维护 函数的创建 pyt ...
- centos下python中添加easygui模块
前提:python中要集成Tkinter,Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同 ...
- python中全局变量的使用
python中在module定义的变量可以认为是全局变量, 而对于全局变量的赋值有个地方需要注意. test.py ------------------------------------------ ...
- python 1: 解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题
问题: 我在ubuntu14.04下用python中的matplotlib模块内的pyplot输出图片不能显示中文,怎么解决呢? 解决: 1.指定默认编码为UTF-8: 在python代码开头加入如下 ...
- Python中全局变量的引用与修改之格式影响
先来看下面的代码及执行结果: a = 1 b = [2,3] def nums(): a = 2 b[0] = 0 print(a) print(b) print(a) print(b) nums() ...
- Windows下Python中pip安装Pillow报错总结(转载)
遇到的俩种错误1.ValueError: zlib is required unless explicitly disabled using --disable-zlib, aborting 问题原因 ...
- Windows下Python中的中文路径和中文输出问题
这几天有个项目需要写一点类似于脚本的小程序,就用Python写了,涉及到中文路径和中文输出的问题,整理一下. 有一个问题我觉得需要先强调一下,在写Python程序的时候,一定保证编码是utf-8,然后 ...
随机推荐
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(十)使用JRTPLIB传输RTP数据
myRtspClient通过简单修改JRTPLIB的官方例程作为其RTP传输层实现.因为JRTPLIB使用的是CMAKE编译工具,这就是为什么编译myRtspClient时需要预装CMAKE. 该部分 ...
- node服务开发环境判断和启动端口指定---process.env.NODE_ENV
在node启动的时候我们需要在代码里面判断服务器运行环境 可以根据process.env.NODE_ENV来判断 一.开发环境的判断 1.安装 npm i -g cross-env 2.启动 cros ...
- 基于jquery ajax的多文件上传进度条
效果图 前端代码,基于jquery <!DOCTYPE html> <html> <head> <title>主页</title> < ...
- svn回复历史版本的操作方法
svn恢复历史版本的操作方法svn update 保证最新svn log login.php 获得版本号svn diff -r 11026:11027 login.php 发现11027出问题svn ...
- C#中换行的代码
1.Windows 中的换行符"\r\n"2.Unix/Linux 平台换行符是 "\n".3.MessageBox.Show() 的换行符为 "\n ...
- RocketMQ的使用
1 在resources目录下创建config目录,新建文件rocketmq.properties文件 # 指定namesrv地址 suning.rocketmq.namesrvAddr=localh ...
- <1>Cocos Creator安装和启动
学习之间需要了解JavaScritp基本语法和面向对象,详情参考https://blog.csdn.net/jadeshu/article/category/7476938 1.下载Cocos Cre ...
- 使用js Math.random()函数生成n到m间的随机数字
何使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备,Math.random()函数返回0和1之间的伪随机数 摘要: 本文讲解如何使用js生成n到m间的随机数字,主要目的是为后 ...
- web.config 特殊字符转义
字符 转义码 & 符号 & & 单引号 ' ' 双引号 " " 大于 > > 小于 < <
- 仿豆瓣网(电脑版网页)HTML+CSS实现
步骤一:将豆瓣电脑版网页以图片形式保存下来: 利用了chrome里面的插件: 步骤二:将图片放置到PS中,研究布局: 我将其分为header部分,banner部分,section部分,footer部分 ...