Python中利用exec动态创建变量并赋值的方法
本文介绍如何在Python中使用exec函数动态生成变量名并进行赋值。通过字符串格式化占位符与循环结合,可实现批量创建如temp0至temp9等变量。文章涵盖简单赋值、多占位符替换、列表推导式结合以及文件路径动态加载等场景,提供具体代码示例与运行结果,帮助开发者解决运行时变量命名难题。
一、基础情况
核心在于使用exec函数,该函数能够执行作为字符串传入的代码。exec函数的一个简单示例如下:
exec ('print "hello world"')
hello world
从上述示例可以清晰看到,当向exec传入字符串'print "hello world"'时,exec会执行该字符串内部的代码print "hello world"。基于这一特性,我们可以利用占位符来实现变量的定义,例如:
exec ("temp%s=1"%1)
这段代码的作用是让exec执行temp1=1。字符串中的%s被字符'1'所替代。若在外层再包裹一个循环,即可实现对多个变量的定义。
for i in range(10):
exec ("temp%s=1"%i)
在此处,通过一个循环生成10个变量,其中i的取值范围是从0到9。利用变量i替代%s,因此在每次循环迭代中,分别给temp0和temp1等变量进行赋值。
执行结果如下:

如果需要替换多个占位符,可以按如下方式编写代码:
exec ("temp%s=%d"%(i,i))
此处分别以字符串和整数形式替换占位符,其执行结果如下:
temp1=1
再举一例:
df_vars = [ 'df_%s_head' %i for i in range(0,10)]
df_vars列表内容:
['df_0_head', 'df_1_head', 'df_2_head', 'df_3_head', 'df_4_head', 'df_5_head', 'df_6_head', 'df_7_head', 'df_8_head', 'df_9_head']
又如:
for i in range(8):
exec('v' + str(i) + ' = ' + str(i))
print('v' + str(i) + ':', eval('v' + str(i)))
输出结果:

示例代码:
在Python中,为了生成顺序命名的变量并将其赋值,例如:
a_1 = [] a_2 = [] a_3 = [] ..... a_100 = []
可以利用将字符串转换为变量执行的函数exec。
for i in range(1,100):
b = 'a_' + str(i)
exec(b + '= %r' % [])
二、稍复杂的命名场景
提取出的文件路径示例:
D:/MyData/Excel/input/MarketHoliday_2018.xls
D:/MyData/Excel/input/MarketHoliday_2019.xls
。。。
D:/MyData/Excel/input/MarketHoliday_2023.xls
year = [2018,2019,2020,2021,2022,2023] file_path = 'D:/MyData/Excel/input/MarketHoliday_' #注意:这里一定要用单引号
首先需要将year转换为字典格式,以便在For循环中使用,此处使用pandas进行转换。
import pandas as pd year = pd.Series(year) year_dict = year.to_dict()
得到的结果:

for i in year_dict:
exec('Var_'+str(year_dict[i])+'='+'"'+(file_path + str(year_dict[i])+'.xls'+'"'))
print('Var_'+str(year_dict[i])+':',eval('Var_'+str(year_dict[i])))
最终运行结果:

Python动态生成变量名及赋值详解
今晚在处理数据时偶然遇到一个命名上的难点,但为了实现自动化处理,坚决不手动一条一条输入参数,决定解决此问题。具体问题是:
首先想要调用一个方法,输入的变量可以是字符串,但如果直接把字符串输入则无法直接生效。
这里提供相关代码:
t=['42342lh','234']
s='fgdfhdfhdfh'
exec(s+'=%s'%'t[0]')
print(fgdfhdfhdfh)
for i in range(2):
m=f'names{i}'
exec(m+'=%s'%'t[i]')
print(names1)
可以看出m可以按照规律变化,同时也能规律读取,最后每个m都成为了独立的变量。
以上为个人经验总结,希望能给大家提供一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













