前两天想用python写个脚本,里面需要自动创建一系列的空列表,经过搜索发现两种方法可以:
方法1、用 exec() 函数。
它的作用是 exec 执行储存在字符串或文件中的 Python 语句。
例如:
# exec(source, globals=None, locals=None, /)
# 上面参数最后的‘/’,表示exec只接收位置参数,参数类型为字典。
# source: 为字符串,是供exec执行的代码。
# globals:全局变量。参数可为 globals()
# locals: 局部变量。参数可为 locals(),也可以为一个自定义字典。
# 1、没有 globals 和 locals 参数。
def fun_1():
a = 1
exec('b= 2')
exec('c = 3')
exec('print(locals())') # 结果为: {'a': 1, 'b': 2, 'c': 3}
print(locals()) # 结果为: {'a': 1, 'b': 2, 'c': 3},两个结果一样。
exec('print(a+c)') # 结果为:4。说明 exec能调用 变量 a。
#print(a+c) # NameError: name 'c' is not defined
# 说明在外部不能调用exec中的变量。
fun_1()
print('==========================', end='\n\n')
# 2、只有一个locals 的位置参数。
def fun_2():
a = 1
exec("b=2", None, locals())
exec('c = 3')
exec('print(locals())') # 结果为:{'a': 1, 'b': 2, 'c': 3}
print(locals()) # 结果为:{'a': 1, 'b': 2, 'c': 3} 两个一样。
#print(a+b) # NameError: name 'b' is not defined
# 说明在外部不能调用exec中的变量。
fun_2()
print('=========================', end='\n\n')
# 3、只有一个globals的位置参数。
def fun_3():
a = 1
exec('b= 2', globals())
print(a+b) # 结果为:3。说明此时可以调用变量‘b’了。
print(globals()) # 结果为: {'__name__': '__main__', … , 'b': 2}
# 说明全局变量中有变量‘b’。
fun_3()
print('=========================', end='\n\n')
# 4、有globals 和 locals 的位置参数。
def fun_4():
a = 1
exec("c=3", globals(), locals())
exec('print(locals())') # 结果为:{'a': 1, 'c': 3}
print(globals()) # 全局变量中没有‘c’。
# 说明当两个参数共同存在时, exec创建的变量
#只存在于局部变量中,不会存到全局变量中。
fun_4()
在exec()里用 三对引号括起来,也可以执行多行文本代码,如下:
for i in range(1,6):
exec('''list_{}=[]
list_{}.append({})'''.format(i,i,i*2))
结果为: list_1 = [2],list_2 = [4] …… list_5 = [10]
方法2:用locals() 或者 globals()
def test_locals():
a = 1
b = 2
locals()['c'] = 3
print(locals()) # 打印为:{'b': 2, 'a': 1, 'c': 3},说明可以动态的添加局部变量。
locals()['b'] = 10 # 尝试在局部域中修改“赋值”变量的值……
locals()['c'] = 30 # 尝试在局部域中修改“动态”变量的值……
print(locals()) # 打印为:{'b': 2, 'a': 1, 'c': 30}, ‘b’ 的值没变,'c'变了。
test_locals()
# 结论:locals()中的变量,无法改变”赋值“的变量的值(例如上面的 a=1),
# 但可以改变以字典键值对方式动态添加的值。
用globals 可以:
a = 1
def test_globals():
b = 2
globals()['c'] = 3
print(globals()) # 打印为:{…, 'a': 1, …, 'c': 3}, 没有‘b’。
globals()['a'] = 10
globals()['c'] = 30
print(globals()) # 打印为:{…, 'a': 10, …, 'c': 30},'a' 和 'c' 都被修改了。
test_globals()