python中global用法实例分析

       lobal语句是适用于当前整个代码块的声明。它是全局变量标识符。如果某名字在局部名字空间中没有定义, 就自动使用相应的全局名字. 没有global是不可能手动指定一个名字是全局的.在 global 中出现的名字不能在global 之前的代码中使用.在 global 中出现的名字不能作为形参, 不能作为循环的控制对象, 不能在类定义, 函数定义, import语句中出现.

1、global---将变量定义为全局变量。可以通过定义为全局变量,实现在函数内部改变变量值。

2、一个global语句可以同时定义多个变量,如 global x, y, z

>>> def func():
...   global x
...   print 'x is ', x
...   x = 2
...   print 'Change local x to ', x
...
>>> x = 50
>>> func()
x is 50
Change local x to 2

global语句的作用:

       在编写程序的时候,如果想为一个在函数外的变量重新赋值,并且这个变量会作用于许多函数中时,就需要告诉python这个变量的作用域是全局变量。此时用global语句就可以变成这个任务,也就是说没有用global语句的情况下,是不能修改全局变量的。

       在python的函数使用时,经常会碰到参数定义的问题。如果不声明全局变量,会报错

count = 1
def cc():
 count = count+1
cc()
Traceback (most recent call last):
File "<ipython-input-17-f6b58c567c1a>", line 1, in <module>
 cc()
File "<ipython-input-16-aab94f1185b9>", line 2, in cc
 count = count+1
UnboundLocalError: local variable 'count' referenced before assignment

        意思是说count为局部变量,在使用它之前没有被赋值。在函数内无法直接使用全局变量。

num = 1
id(num)
Out[31]: 1886744032
def cc():
 num = 2
 print(id(num))
 print(num)
cc()
1886744064
2

        可以看出函数里面的num是局部变量,有什么办法能在函数内使用全局变量呢?根据官方文档,可以用global语句:

1.The global statement is a declaration which holds for the entire current code block. It means that the 
2.listed identifiers are to be interpreted as globals. It would be impossible to assign to a global variable without global.

         意思是说global语句可以声明一个或多个变量为全局变量。该声明仅在当前代码块中有效。除此之外,没办法访问全局变量。所以在函数中添加global声明:

 

def cc():
 global count
 count = count+1
 print(count)
cc()
2

           用global声明多个变量需要用逗号分

num = 0
def cc():
 global count,num
 count = count+1
 num = num+2
 print(count,num)
cc()
3 2
# 可以函数中的global声明能够修改全局变量
num
Out[24]: 2
# 
count
Out[25]: 3
在使用全局变量的场合,也可用类变量代替
class C:
 count = 3
def cc():
 count = C.count+1
 print(count)
cc()
4

          如果是想在函数中调用全局变量,这需要global声明。之后调用全局变量,全局变量的值也随之可能发生改变,如果是count = count+1这种再定义的时候,否则全局变量只是被调用。也可以通过class来调用变量的方法达到全局变量的效果

          global的作用就相当于传递参数,在函数外部声明的变量,如果在函数内想要使用,就用global来声明该变量,这样就相当于把该变量传递进来了,就可以引用该变量了

  再看一个例子:

>>>x = 8
>>>def func():
>>>    global x
>>>    x = 2
>>>
>>>func()
>>>print x
输出结果:2

      用print语句输出x的值,此时的全局变量x值被重新定义为1

      python中的global语句是被用来声明是全局的,所以在函数内把全局变量重新赋值时,这个新值也反映在引用了这个变量的其它函数中

接上面的代码块
 
>>>def fun2():
>>>    return x
>>>fun2()
>>>print x
输出结果:2

        这里看到fun2函数return返回值是全局变量x,它的值还是2。因此新值也反映在引用了这个变量的其它函数中

进一步详谈global修饰的用法:

       首先是python中的一个奇异现象,在模块层面定义的变量,按理就是全局变量,在整个模块任意处都可以调用的,可以在函数中当做全局变量使用:

a = 6
def A():
   print(a)
A()
print(a)

       上面代码都可以正常运行,且输出都为6

       但是如果在函数中有再赋值/定义(因为python是弱类型语言,赋值语句和定义语句一样),则会产生未定义变量的错误,如下

a=4
def h():
    print(a)
    a=12

h()
print(a)

       运行会抛出:UnboundLocalError: local variable 'a' referenced before assignment

       而如果在函数中的定义在引用前使用,那么会正常运行,但函数中的变量和模块中的定义的全局变量不为同一个

a=4
def h():    
    a=12
    print(a)

h()
print(a)

        输出为12和4, h函数中使用的是局部变量a,最后的print使用的是全局变量a

         那么我们会有疑问,如果我想在函数使用莫伊变量后再对其进行修改,怎么让函数中使用的变量是模块层定义的那个全局变量而不是函数内部的局部变量呢?这里就可以用到global修饰符了。

a=4
def h(): 
    gloabl a   
    print(a)
    a=12

h()
print(a)

        在用global修饰声明后的a就是全局变量,最后上面代码输出的是4和12

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值