Python中如何根据列表长度动态创建新变量?
实现思路说明
首先明确:绝大多数场景下都不建议动态创建零散的独立变量,用Python原生的列表、字典这类结构化容器存储结果是更规范、可维护性更高的方案,只有在极少数特殊场景下才需要用到动态修改变量命名空间的写法。
推荐方案:结构化存储(优先使用)
零散的var/var1/var2这类变量后续遍历、批量处理、排查问题都非常麻烦,直接用列表按顺序存储结果即可,写法非常简洁:
import requests import json # 注意不要用list作为变量名,会覆盖Python内置的list类型,这里改名为url_list url_list = ["接口地址1", "接口地址2", "接口地址3", "接口地址4"] # 一行代码完成所有接口请求和解析,索引和你预期的变量一一对应 results = [requests.get(url).json() for url in url_list] # 对应原来的var:results[0] # 对应原来的var1:results[1] # 对应原来的var2:results[2] # 对应原来的var3:results[3]
注:requests库的响应对象自带
.json()方法,效果和json.loads(response.text)完全一致,写法更简洁。
如果你需要保留var/var1这类变量名做key,用字典存储会更灵活:
result_map = {} # 第一个值对应key为var result_map["var"] = requests.get(url_list[0]).json() # 后续值对应key为var1、var2... for idx in range(1, len(url_list)): result_map[f"var{idx}"] = requests.get(url_list[idx]).json() # 取值直接按key取即可:result_map["var"]、result_map["var1"]
用容器存储的优势非常明显:后续要对所有结果做统一处理(比如批量存库、批量校验字段)时,直接遍历容器即可,不需要手动枚举所有变量名,也不会污染当前作用域的命名空间,IDE可以正常做代码补全和错误检查。
不推荐但可实现的动态变量创建方法
如果你确实需要在当前作用域生成独立的var/var1这类变量,可以通过修改全局命名空间或者执行动态代码实现,但是这类写法可维护性差、有安全风险,非必要不要使用:
方法1:修改globals()命名空间
Python的全局变量存在globals()返回的字典中,直接给这个字典添加键值对就可以生成全局变量:
# 生成第一个变量var globals()["var"] = requests.get(url_list[0]).json() # 批量生成var1、var2... for idx in range(1, len(url_list)): globals()[f"var{idx}"] = requests.get(url_list[idx]).json()
方法2:用exec()执行动态拼接的代码
通过字符串拼接出变量赋值的代码,交给exec()执行也能达到效果:
exec("var = requests.get(url_list[0]).json()") for idx in range(1, len(url_list)): exec(f"var{idx} = requests.get(url_list[idx]).json()")
风险提示:如果url_list的内容可以被用户控制,
exec()写法会直接导致远程代码执行漏洞,绝对不要在对外提供服务的生产代码中使用这类写法。
内容的提问来源于stack exchange,提问作者swimmeryay15
相关产品推荐
相关产品推荐

