python中全局变量的使用

看一个例子:
NUM = 0
ARRAY = [0]

def fun1(NUM, ARRAY):
    NUM += 1
    ARRAY[0] += 1
fun1(NUM, ARRAY)
print 'after fun1 %d %s' % (NUM,ARRAY)

def fun2():
    global NUM
    NUM += 1
    ARRAY[0] += 1
fun2()
print 'after fun2 %d %s' % (NUM,ARRAY)

执行结果:

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

fun1中,NUM作为int是immutable类型对象,ARRAY是list,list中的值是mutable,所以执行后全局的NUM未变但ARRAY变了;因为给immutable对象赋值,会自动创建新的局部变量来代替。

fun2中,使用Python的关键字global才可以在函数内强行操作immutable全局变量NUM,实则是重新建立了全局变量,删除了老的全局变量NUM;global是声明全局变量,nonlocal是上一层变量。但如果仅仅访问而不修改,在函数内是可以不用global直接使用的,比如在fun2中只是print NUM

判断这个引用是否可以改变源数据:
  1. 判断在这个局部的块中是否改变了这个变量的值,如果只是读,而没有修改操作,那么用的是全局
  2. 是普通类型还是引用类型,python中不必考虑这个问题,因为python都是引用类型
  3. 是mutable类型还是immutable类型,Java 中immutable变量是基本类型String,加了final修饰的对象等
  4. 其实能够修改元数据的情况只有一种就是,要修改值,是引用变量,并且是可变类型。
Python中怎么用全局变量好:
  • 首先,使用基本类型的全局变量需要在每个操作它的函数、类里面用global声明还是挺麻烦的;
  • 列表或元组呢,访问的时候用数字索引会降低代码的可读性;
  • 用字典(dict)则可以解决上面两个问题,在简单的程序中dict应该是很合适的;
  • 但是,在复杂的代码中如果需要对全局变量的修改进行一定的控制,或者在多组多个线程每组共享同类型但不同值的全局变量时,dict就无法胜任;

所以,可以自定义一个类来保存所有的全局变量:

  • 简单时就直接访问成员变量;
  • 需要控制时就声明为私有变量,用成员函数访问和修改;
  • 多组多线程分开共享时就每组new一个新实例即可;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值