python中globals()函数:如何批量生成变量并赋值?

2020/12/29 Hongmin
Python 3.6.3 |Anaconda custom (64-bit)|

【问题引入】
python中定义变量并赋值时,可以用下面的格式:
变量名 = 值
比如,想定义变量number,并赋值为5,可以用这个语句: number = 5
但是,如果想生成从number1、number2、number3……number100,分别赋值为1、2、3……100,应该如何操作呢?

globals()函数】
以字典形式返回包含当前作用域全局变量。

In[5]: globals??
Signature: globals()
Docstring:
Return the dictionary containing the current scope's global variables.
# 返回包含当前作用域全局变量的字典。
NOTE: Updates to this dictionary *will* affect name lookups in the current
global scope and vice-versa.
Type:      builtin_function_or_method

通过globals()函数,可以实现批量生成变量名并赋值的目的。回到之前的问题,可以用如下代码实现:

In[9]: names = globals()
  ...: for i in range(1,100):
  ...:     names ['number%s' % i] = i
  ...: print(number1)
  ...: print(number14)
  ...: print(number88)
1
14
88

生成的变量如下图所示:

——————补充——————

【关键字 global

在python中,函数内部声明的变量称为局部变量;而全局变量,顾名思义,则是在整个py文件中声明的变量,作用域是全局作用域。

由于函数内部的运算不能改变函数外的变量,因此,如果在函数中改变全局变量,需要在函数内声明变量是全局变量才可以。

比如,已知变量a的值是5,想通过函数plus_a(n)实现a+n的计算过程,如果写成如下代码,是无法实现的:

In[10]: a = 10
   ...: def plus_a(n):
   ...:     a = a + n
   ...:     return a
   ...: 
In[11]: plus_a(10)
Traceback (most recent call last):
  File "D:\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 2862, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-11-feed4f90e5e8>", line 1, in <module>
    plus_a(10)
  File "<ipython-input-10-c89608433294>", line 3, in plus_a
    a = a + n
UnboundLocalError: local variable 'a' referenced before assignment
# 报错:在引用局部变量a前并未对a赋值

在这段代码中,plus_a()内的a是局部变量,和全局变量a指向的是两个不同的变量。因此,在函数内部,并没有给局部变量a赋值,故报错。

这段代码应该改为:

In[12]: a = 10
   ...: def plus_a(n):
   ...:     global a
   ...:     a = a + n
   ...:     return a
   ...: 
In[13]: plus_a(10)
Out[13]: 20
In[14]: a
Out[14]: 20

这样,就可以通过函数对全局变量进行修改了。

本文地址:https://blog.csdn.net/yang_hmin/article/details/111932618