Python中利用exec动态创建变量并赋值的方法

洛溪
洛溪
发布时间:2026-10-12| 3人浏览过
原创

本文介绍如何在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都成为了独立的变量。

以上为个人经验总结,希望能给大家提供一个参考,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。