0

我正在构建一个生物模拟器。它将在两个 for 循环中运行,一个跟踪一天,一个跟踪一天中的时间。我有一本关于我所有生物的字典,叫做 awake,它是在每天开始时设置的。在一天循环中的某个时间点,生物会变得疲倦并入睡。模拟将它们从唤醒字典中删除,以便在一天中的剩余时间循环中不会考虑它们。但问题是,由于某种原因,唤醒字典会随着一天中的每个时间循环而重置,以便访问沉睡的生物。我已经在这里发布了相关代码,这是唯一一次使用 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)
4

2 回答 2

6

您正在循环awake并同时修改它。这意味着某些项目将被跳过

而是创建一个副本awake断开循环迭代器的连接,awake以便您可以修改后者而不影响循环:

for creature in list(awake):

但是,您最大的问题是您在循环开始时设置awake为,有效地更改. 也许您打算改用?self.creaturesself.creaturesself.awake

于 2013-04-03T14:40:48.573 回答
2

在每天开始时,您需要制作creaturesdict 的副本而不是引用它:

awake = dict(self.creatures)

这是 Python 中各种可变类型的常见陷阱。

Python 只有对对象的引用,而不是像“变量”这样的东西。所以写作a=b只是创建一个新的引用,命名a为已经被b.

于 2013-04-03T14:43:25.337 回答