Python字典在循环外重置

时间:2013-04-03 14:36:40

标签: python for-loop dictionary

我正在建造一个生物模拟器。它将在两个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)

2 个答案:

答案 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的新引用。