如何用exec()构造多层for循环?遇'unexpected indent'报错
问题原因
你这段代码触发unexpected indent错误的核心原因:
- 缩进归属混乱:
exec()仅执行了循环的声明语句,后续的batch_data = batch_data.to(device)是独立代码行,它的缩进既不属于外层for b循环,也不属于exec内部的循环(因为该行不在exec的字符串范围内),Python无法识别这个缩进的合法归属。 - 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
相关产品推荐
相关产品推荐

