为何每次迭代创建的Room对象均相同?如何生成唯一Box内容组合?
问题原因与解决方案
问题原因
你在Room类中定义的boxes = []是类属性,它属于整个Room类本身,而非单个Room实例。所有通过Room()创建的对象都会共享这同一个boxes列表:
- 第一次创建
Room时,会向这个共享列表中添加5个Box对象; - 后续每次创建新的
Room,都会继续往这个共享列表里追加新的Box; - 你每次打印的
room.boxes[0]始终是列表中第一个被添加的Box,所以内容完全不变。
解决方法
将boxes改为实例属性,在__init__方法内部初始化,让每个Room实例拥有独立的boxes列表:
import random class Box: def __init__(self, box_number, box_content): self.number = box_number self.content = box_content def __str__(self): return f"Box: {self.number} | Content: {self.content}" class Room: def __init__(self, num_of_boxes): # 在这里初始化实例属性boxes,每个Room实例都有独立的列表 self.boxes = [] box_contents = [*range(num_of_boxes)] random.shuffle(box_contents) for i in range(num_of_boxes): self.boxes.append(Box(i + 1, box_contents[i] + 1)) def run_cycle(): room = Room(5) print(room.boxes[0]) for _ in range(5): run_cycle()
修改后,每次创建Room都会生成全新的独立boxes列表,随机打乱的内容也会应用到当前实例的列表中,运行后就能看到每次输出的Box内容都不同了。
内容的提问来源于stack exchange,提问作者YangTegap
相关产品推荐
相关产品推荐

