首先看一段代码:

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. git 不区分文件大小写的处理

  2. componentsSeparatedByString 的注意事项

    componentsSeparatedByString 两种情景 1. 没有分割符也生成一个数组,元素就是整个字符串本身,那你就需要判断“”这种字符串. 2. 分割的元素如果是相同的字符串,指向的是同 ...

  3. test4

  4. iOS UIViewController生命周期控制

    具体流程,看下图: init方法在init方法中实例化必要的对象(遵从LazyLoad思想)init方法中初始化ViewController本身 loadView方法当view需要被展示而它却是nil ...

  5. python 参数解析ArgumentParser

    #!/usr/bin/env python #coding:utf-8 from argparse import ArgumentParser #--------------------------- ...

  6. cocos2d JS 使用代码判断对象类型

    changeAtlasScoreString : function (score,tfScore) { if(tfScore.getDescription() == "LabelAtlas& ...

  7. 当我的url请求会变成jsp页面路径时的解决办法

    @RequestMapping(value="shippingOrder") $.post("/ezsh/orderAd/shippingOrder",para ...

  8. AIX挂载NFS写入效率低效解决

    背景: Linux是NFS的Server端,AIX是NFS的Client端(此外,有一个Linux也作为Client端对比测试). 1.NFS对应的底层设备是闪存卡,本地测试I/O写性能可达2GB/s ...

  9. Oracle 22表空间

    数据库与表空间: 表空间实际上是数据库上的逻辑储存结构,可以把表空间理解为在数据库中开辟的一个空间,用于存放我们的数据库的对象,一个数据库可以由多个表空间构成. 表空间与数据文件: 表空间实际上是由一 ...

  10. c#之如何计算哈希值字符串

    代码如下: /// <summary> /// 计算哈希值字符串 /// </summary> public static string ComputeHash(byte[] ...