如何遍历命名规律相近的对象 无需重复编码且不使用eval
遍历规则命名实例的实现方案
核心原则:批量生成的同类型对象不要使用Car_1、Car_2这类带编号后缀的独立变量存储,从根源上用容器管理对象才是无额外开销、易维护的正确实现,完全不需要用到eval()。
推荐实现:创建实例时直接存入序列容器
新写代码直接放弃零散定义变量的思路,批量生成的实例直接存入列表,遍历操作零额外成本,是Python的标准实践:
# 一行代码生成100个Car实例,全部存入列表 cars = [Car() for _ in range(100)] # 直接迭代列表即可完成所有实例的遍历 for car in cars: # 在此处编写每个实例需要执行的逻辑 car.refuel() car.drive()
如果需要匹配原来的编号逻辑,直接用列表下标做偏移即可:cars[0]对应原来的Car_1,cars[i]对应原来的Car_{i+1},也可以根据需求调整索引起始位置。
兼容实现:适配已存在零散变量的遗留代码
如果是已经写完的老代码,已经定义了Car_1到Car_100的独立变量、重构成本太高,可以直接读取Python命名空间的内置字典获取变量,没有eval()的字符串解析、代码执行开销,性能和普通变量查找一致:
cars = [] # 变量定义在全局作用域用globals(),定义在函数内部就替换为locals() current_namespace = globals() for num in range(1, 101): cars.append(current_namespace[f"Car_{num}"]) # 后续遍历逻辑和上述方案完全一致 for car in cars: car.park()
注意:该方案仅用于兼容不可修改的遗留代码,不要在新代码中使用。零散定义批量同类型变量本身就是反模式,会污染命名空间,后续增删、查找实例的维护成本极高。
内容的提问来源于stack exchange,提问作者Walid
相关产品推荐
相关产品推荐

