使用Python的 globals(), locals() 和 exec() 动态创建变量

使用Python的 globals(), locals()exec() 动态创建变量

问题描述

我们有一个值的列表,需要为每个值创建一个独立的变量。例如,我们有一个包含100个元素的列表,我们想要创建100个变量,每个变量的名称为v1, v2, …, v100,并且每个变量的值对应列表中的一个元素。

使用globals()函数

globals()函数返回一个全局命名空间的字典。我们可以使用这个字典来创建新的全局变量:

values = [i+1 for i in range(100)]
for i, value in enumerate(values, start=1):
    globals()[f'v{i}'] = value

print(v1, v2, v3)  # prints: 1 2 3

这个例子中,使用globals()函数返回的字典来创建新的全局变量。每个变量的名称是通过字符串格式化生成的,变量的值则来自values列表。

使用locals()函数

locals()函数返回一个局部命名空间的字典。需要注意的是,对locals()返回的字典进行修改可能不会影响到局部命名空间。因为locals()返回的字典在某些情况下是对实际局部命名空间的拷贝,而不是引用。因此,通常不使用locals()来创建新的局部变量。

使用exec()函数

exec()函数可以将一个字符串作为Python代码执行。因此可以使用这个函数来创建新的变量:

values = [i+1 for i in range(100)]
for i, value in enumerate(values, start=1):
    exec(f'v{i} = {value}')

print(v1, v2, v3)  # prints: 1 2 3

这个例子中,使用exec()函数执行一个字符串,这个字符串创建了一个新的变量,并赋予了它一个值。

安全性和可维护性

虽然globals()exec()函数可以用来动态创建变量,但并不推荐使用。因为它可能带来安全问题,并且使代码难以理解和维护。

首先,globals()exec()函数都可以执行任意Python代码,也就是说它们可能被用来执行恶意代码。因此,应该避免在处理用户输入时使用这两个函数。

其次,动态创建变量使得代码难以理解和维护。当看到一个变量时,无法搞清楚它是在哪里定义的。此外,如果使用文本编辑器的搜索功能,可能无法找到所有的变量定义。

综上,如果需要存储一系列的值,最好的做法是使用一个字典或者列表,而不是动态创建变量。这样做既安全,又易于理解和维护。


使用Python的 globals(), locals() 和 exec() 动态创建变量
https://www.lihaibao.cn/2024/01/30/使用Python的-globals-locals-和-exec-动态创建变量/
Author
Seal Li
Posted on
January 30, 2024
Licensed under