python全局变量global_python中在哪些情况下必须使用global来声明全局变量

import threading, time, sys

x = 50

l = threading.Lock()

def threadcode():

global x

l.acquire()

print 'Thread %s invoked.' % threading.currentThread().getName()

try:

print 'Thread %s running.' % threading.currentThread().getName()

x = x + 50

print 'Thread %s set x to %d.' % \

(threading.currentThread().getName(), x)

finally:

l.release()

......

推广一下,就成了在什么情况下必须使用global声明全局变量的问题。这段代码不用在函数中声明global x也可以打印出x的值

[python] view plain copy

x = 20

def getx():

print x

getx()

在segmentfault上提问,得到了这样的回答

[plain] view plain copy

对于Python2而言,对于一个全局变量,你的函数里如果只使用到了它的值,而没有对其赋值(指a = XXX这种写法)的话,就不需要声明global。相反,如果你对其赋了值的话,那么你就需要声明global。声明global的话,就表示你是在向一个全局变量赋值,而不是在向一个局部变量赋值。

这样一来就清楚了。原因想来应该是这样,如果在函数内对一个全局变量赋值而没有提前声明的话,它会被当成一个与全局变量同名的局部变量,像这样

[python] view plain copy

x = 20

def getx():

x = 50

print x

getx()#print 50

所以如果把第一段代码中的global x注释掉,执行到x = x + 50就报错,因为这里的x既不是全局变量,也没有作为局部变量被初始化。而对于l,因为它是一个对象,调用对象成员函数和访问普通变量的值一样,所以也不需要事先声明其为全局变量,就像下面这样。

[python] view plain copy

class A:

def __init__(self, x):

self.x = x

def setx(self, x):

self.x = x

a = A(50)

def func():

a.setx(20)

print a.x

func()#print 20

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值