You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用exec()构造多层for循环?遇'unexpected indent'报错

问题原因

你这段代码触发unexpected indent错误的核心原因:

  1. 缩进归属混乱:exec()仅执行了循环的声明语句,后续的batch_data = batch_data.to(device)是独立代码行,它的缩进既不属于外层for b循环,也不属于exec内部的循环(因为该行不在exec的字符串范围内),Python无法识别这个缩进的合法归属。
  2. exec使用逻辑错误:就算强行把循环体塞进exec字符串,这种动态拼接变量名的写法也极不规范,可读性差、调试困难,还容易引发变量污染。
正确解决方案

推荐写法(Pythonic,优先选择)

放弃exec(),把所有数据加载器存入一个列表,直接遍历列表即可:

# 先将所有loader存入列表(根据你的实际初始化逻辑填充)
data_train_loaders = [data_train_loader0, data_train_loader1, ..., data_train_loaderN]

# 遍历所有loader处理批次数据
for loader in data_train_loaders:
    for i, batch_data in enumerate(loader):
        batch_data = batch_data.to(device)
        # 在这里添加你的批次数据处理逻辑

不推荐的exec修正写法(仅作演示)

如果非要用exec,必须把完整的循环逻辑(包括缩进)塞进exec的字符串中:

for b in range(num_loader + 1):
    exec(f"""
for i, batch_data in enumerate(data_train_loader{b}):
    batch_data = batch_data.to(device)
    # 所有循环体代码都必须写在这个字符串内部
""")

再次强调:这种写法违背Python的设计原则,尽量避免使用。

内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:39:32