使用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-动态创建变量/