Python内置函数(26)——globals

如果你对Python函数变量在实际的应用中有不解之处时,你可以观看我们的文章,此文章主要介绍的是在Python函数变量中如何使用global语句,及相关功能的介绍,以下是文章的具体内容。

global基础介绍

Python中
global用于声明命名空间,它告诉Python函数打算生成一个或多个全局变量名。

  偶然遇到一次“global name ‘aglobalname’ is not
defined
”问题,又重新理解了一下global全局变量的用法

如果你想了解Python函数变量如何工作相关的实际应用技巧,你可以在我们的文章中找到相关的Python函数变量的应用技巧,以下是文章的相关内容的详细介绍,希望你看完了以后,会有所收获。

英文文档:

使用global语句

全局变量

  • 全局变量是位于模块文件内部的顶层的变量名
  • 全局变量如果是在函数内被赋值的话必须经过声明
  • 全局变量名在函数的内部不经过声明也可以被引用
1. 常用情况:

  按照我们常用的python全局变量的概念,只要定义了就可以在函数中使用,但其实直接使用全局变量会报错:

#usr/bin/python
#encoding=utf-8
sumAB = 0
def printSumAB(a,b):
    print sumAB
    sumAB = a+b
    print sumAB
printSumAB(1,2)

输出错误信息:

Traceback (most recent call last):
  File "/Users/name/PycharmProjects/untitled/understandGlobal.py", line 8, in <module>
    printSumAB(1,2)
  File "/Users/name/PycharmProjects/untitled/understandGlobal.py", line 5, in printSumAB
    print sumAB
UnboundLocalError: local variable 'sumAB' referenced before assignment

  也就是说我们在函数里打印sumAB的操作是不合法的——虽然在函数外我们已经声明了一个全局的sumAB,但实际上,这样的声明的变量,在局部进行引用或修改是有问题的,我们可以通过查看变量id进行对比:

#usr/bin/python
#encoding=utf-8
sumAB = 0
print id(sumAB)
def printSumAB(a,b):
    sumAB = a+b
    print id(sumAB)
printSumAB(1,2)
print id(sumAB)

输出结果:

#上面打印的三次sumAB的id
140626682200208
140626682200136
140626682200208

  通过上面输出两个sumAB的id可以发现,函数中的sumAB的id与我们以为的全局变量的id不同,这样操作也没有成功修改函数外sunAB的值……

Python函数变量如何工作

globals()

如果你想要为一个定义在函数外的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是全局的。我们使用global语句完成这一功能。没有global语句,是不可能为定义在函数外的变量赋值的。

格式

global语句包含了关键字global,其后跟着一个或多个由逗号分开的变量名。当在函数主体被赋值或被引用时,所有列出来的变量名将被映射到整个模块的作用域内

>>> def func():
...     global X
...     X = 99
... 
>>> func()
>>> print(X)
99
2.借助global声明:

那到底要怎样引用并修改这个全局变量呢?
这个时候就需要借助global啦:

#usr/bin/python
#encoding=utf-8
sumAB = 0
print '最早的sumAB的id',id(sumAB)
def printsumAB(a,b):
    global sumAB
    print '初始sumAB = ',sumAB
    print '初始sumAB的id = ',id(sumAB)
    sumAB = a+b
    print '修改后的sumAB = ',sumAB
    print '修改后的sumAB的id = ',id(sumAB)
printsumAB(1,2)
print '最终的sumAB = ',sumAB
print '最终的sumAB的id = ',id(sumAB)

打印结果:

最早的sumAB的id 140430981252272
初始sumAB =  0
初始sumAB的id =  140430981252272
修改后的sumAB =  3
修改后的sumAB的id =  140430981252200
最终的sumAB =  3
最终的sumAB的id =  140430981252200

  这个时候,可以发现,成功的修改了我们想要改变的全局变量(^-^)而关键点,就是要声明“global”;但是有时候为什么我们没有声明global,还是可以使用全局变量呢?
  ——引用全局变量时,不需要global声明;但是后面使用或者修改这个全局变量的时候,需要global声明~~~不然就会报错

在函数中,我们第一次使用x的值的时候,Python使用函数声明的形参的值。接下来,我们把值2赋给x。x是函数的局部变量。所以,当我们在函数内改变x的值的时候,在主块中定义的x不受影响。在最后一个print语句中,我们证明了主块中的x的值确实没有受到影响。

Return a dictionary representing the current global symbol table. This
is always the dictionary of the current module (inside a function or
method, this is the module where it is defined, not the module from
which it is called).

你可以使用定义在函数外的变量的值假设在函数内没有同名的变量)。然而,我并不鼓励你这样做,并且你应该尽量避免这样做,因为这使得程序的读者会不清楚这个变量是在哪里定义的。使用global语句可以清楚地表明Python函数变量是在外面的块定义的。

3.【补充说明】

  在’main‘这个程序入口修改修改全局变量,就不需要再用global声明了:

#usr/bin/python
#encoding=utf-8
sumAB = 0
print '最早的sumAB的id',id(sumAB)
if __name__ == '__main__':
    global sumAB
    sumAB = sumAB+1
    print '最终的sumAB = ', sumAB
    print '最终的sumAB的id = ', id(sumAB)

输出结果:

/Users/name/PycharmProjects/virtual/bin/python /Users/name/PycharmProjects/untitled/understandGlobal.py
/Users/name/PycharmProjects/untitled/understandGlobal.py:20: SyntaxWarning: name 'sumAB' is assigned to before global declaration
最早的sumAB的id 140546367576960
  global sumAB
最终的sumAB =  1
最终的sumAB的id =  140546367576936

  从以上输出结果可以看出,程序运行没有报错,也成功修改全局变量sumAB,但给出了警告,表示在声明为全局变量前,它已经被赋值了……

这个时候我们去掉global声明,再试一次:

#usr/bin/python
#encoding=utf-8
sumAB = 0
print '最早的sumAB的id',id(sumAB)
if __name__ == '__main__':
    # global sumAB
    sumAB = sumAB+1
    print '最终的sumAB = ', sumAB
    print '最终的sumAB的id = ', id(sumAB)

打印结果:

最早的sumAB的id 140352440784096
最终的sumAB =  1
最终的sumAB的id =  140352440784072

没有出现报错,而且成功修改了全局变量~

  个人理解是,main作为程序执行入口,本身就可以理解为是一个全局的概念,即使用在if下面,但是也仍然是针对全局而言,所以这个时候修改全局变量是全局的,不需要担心出现一个新的局部变量~

使用global语句

说明:

例7.4 使用global语句

如果你想要为一个定义在函数外的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是
全局
的。我们使用global语句完成这一功能。没有global语句,是不可能为定义在函数外的变量赋值的。

  1. 返回当前作用域内全局变量的字典。

#!/usr/bin/python  # Filename: func_global.py  def func():  global x  print 'x is', x  x = 2 print 'Changed local x to', x  x = 50 func()  print 'Value of x is', x    

你可以使用定义在函数外的变量的值假设在函数内没有同名的变量)。然而,我并不鼓励你这样做,并且你应该尽量避免这样做,因为这使得程序的读者会不清楚这个变量是在哪里定义的。使用global语句可以清楚地表明Python函数变量是在外面的块定义的。

>>> globals()
{'__spec__': None, '__package__': None, '__builtins__': <module 'builtins' (built-in)>, '__name__': '__main__', '__doc__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>}
>>> a = 1
>>> globals() #多了一个a
{'__spec__': None, '__package__': None, '__builtins__': <module 'builtins' (built-in)>, 'a': 1, '__name__': '__main__', '__doc__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>}

输出

例7.4 使用global语句

 

$ python func_global.py  x is 50  Changed global x to 2  Value of x is 2   
#!/usr/bin/python  # Filename: func_global.py  def func():  global x  print 'x is', x  x = 2 print 'Changed local x to', x  x = 50 func()  print 'Value of x is', x    

Python函数变量如何工作global语句被用来声明是全局的——因此,当我们在函数内把值赋给其的时候,这个变化也反映在我们在主块中使用其的值的时候。

输出

你可以使用同一个global语句指定多个全局变量。以上的文章就是对Python函数变量中如何使用global语句的简介。

$ python func_global.py  x is 50  Changed global x to 2  Value of x is 2  

Python
函数变量如何工作相关的实际应用技巧,你可以在我们的文章中找到相关的
Python 函数变量的应用技巧,以下是文章的相…

相关文章