如何在循环中调用规律命名变量并用于matplotlib subplot?
解决方案:循环调用命名规律的变量(无需提前存列表的方法)
不是必须先存入列表再使用enumerate(),有两种直接调用的方法,但都存在明显局限性,以下是具体实现及分析:
方法1:通过globals()/locals()字典获取变量
全局和局部变量分别存储在globals()和locals()返回的字典中,键为变量名字符串,值为变量本身。你可以循环生成x_1到x_100的名字字符串,再从字典中取出对应变量:
import matplotlib.pyplot as plt import numpy as np # 模拟生成x_1到x_100的numpy数组(示例用) for i in range(1, 101): globals()[f'x_{i}'] = np.random.rand(50) # 循环绘图示例 plt.figure(figsize=(15,10)) for i in range(1, 101): ax = plt.subplot(10, 10, i) # 从globals字典中取出对应变量 ax.plot(globals()[f'x_{i}']) ax.set_xticks([]) ax.set_yticks([]) plt.tight_layout() plt.show()
注意:这种方式可读性差,易出现变量名冲突,调试和维护不便,不推荐在正式项目中使用。
方法2:使用eval()函数执行变量名表达式
eval()可将字符串作为Python表达式执行,直接获取变量值:
# 自定义处理函数示例 def F(arr): return arr * 2 + 1 plt.figure(figsize=(15,10)) for i in range(1, 101): # 通过eval获取变量 current_x = eval(f'x_{i}') result = F(current_x) ax = plt.subplot(10, 10, i) ax.plot(result) ax.set_xticks([]) ax.set_yticks([]) plt.tight_layout() plt.show()
注意:eval()风险极高,若传入的字符串被恶意构造会导致代码注入,同样存在可读性差、维护困难的问题,强烈不建议使用。
更优方案:存入列表/字典
虽然上面两种方法能满足“不提前存列表”的需求,但更推荐将变量存入列表或字典,原因如下:
- 可读性强,代码逻辑清晰,一眼就能看出是在处理一组相关数据
- 操作便捷,支持
enumerate()、切片、排序等多种列表操作 - 安全可靠,避免
globals()/eval()带来的潜在问题
示例代码:
# 将变量存入列表 x_list = [globals()[f'x_{i}'] for i in range(1, 101)] # 使用enumerate循环处理 plt.figure(figsize=(15,10)) for idx, x in enumerate(x_list, start=1): ax = plt.subplot(10, 10, idx) ax.plot(F(x)) ax.set_title(f'x_{idx}') ax.set_xticks([]) ax.set_yticks([]) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者AmirMohammad Shakeri
相关产品推荐
相关产品推荐

