我正在建造一个生物模拟器。它将在两个for循环中运行,一个跟踪一天,一个跟踪一天中的时间。我有一本叫做清醒的所有生物的字典,它是在每天开始时设置的。在一天中的某个时刻,生物会变得疲倦并进入睡眠状态。模拟将它们从清醒字典中删除,这样它们就不会被考虑用于剩余的时间循环。但是问题出在这里,由于某些原因,唤醒字典会在每天的循环中重置,以便访问睡眠的生物。我在这里发布了相关代码,这是唯一一次使用awake。谁能解释我做错了什么?
for i in range(self.Day):
start = clock()
awake = self.creatures
for j in range(self.timeOfDay):
print("Life Time " + str(i + 1) + "/" + str(self.Day)
+ " Hour " + str(j + 1) + "/" + str(self.timeOfDay))
print(self)
traveling = []
for creature in awake:
goal = None
while goal == None:
priority = creature.priority()
if priority == "improveShelter":
goal = creature.findBest(land.Shelter, self.map)
elif priority == "sleep":
goal = creature.findBest(land.Shelter, self.map)
print(awake)
awake.pop(creature)
答案 0 :(得分:6)
您正在循环awake
并同时修改它。这意味着某些项目将被跳过。
创建awake
的副本,而不是将循环迭代器与awake
断开连接,以便您可以在不影响循环的情况下修改后者:
for creature in list(awake):
然而,您最大的问题是,您在循环开始时将awake
设置为self.creatures
,从而有效地更改了self.creatures
。也许您打算使用self.awake
代替?
答案 1 :(得分:2)
在每天开始时,您需要制作creatures
字典的副本,而不是引用它:
awake = dict(self.creatures)
这是Python中各种可变类型的常见缺陷。
Python只引用了对象,而不是“变量”。因此,编写a=b
只会为a
已引用的同一对象创建一个名为b
的新引用。