伙计们,这很奇怪,可能是我没有看到的一些小错误:
所以我有一个带有键作为元组的字典。每个键都是(状态,动作)的元组,其中状态是包含值和元组的元组。行动是一种价值。
我正在从文件中加载我的字典并且它正确加载。在程序期间的某个时刻,它会检查密钥是否存在。如果是,则更改值,否则创建 dict[key] = 0。
问题是这样的:字典有一个具有特定值的键(状态,动作)。当我尝试使用“in”检查它是否存在时,它表明它不存在。当我检查 dict.keys() 时,它声明它存在。我还输出了 dict.keys() 并且可以验证它确实存在。
此外,如果我将值与其他值进行比较(例如:dict[key] > secondValue),程序就会崩溃。如果我做 dict[key] = secondValue,有时它不会改变键的值,而是创建一个重复的键!然后, dict.keys() 返回两个或多个相同的键。这是一些代码:
if (key not in self.currentDict):
pass
print "key not in self.currentDict"
if key not in self.currentDict.keys():
print "key not in self.currentDict.keys()"
else:
print "key in self.currentDict.keys()"
上面的缩进不是错误,实际代码中缩进是可以的。
现在这些中的每一个都会使程序崩溃:
print "self.currentDict[key] = %s" % (self.currentDict[key])
if (self.currentDict[key] > value)
我真的不知道为什么会这样。如果我启动一个新文件,程序运行并保存到文件中,它可以正常工作。如果我使用现有文件,因此使用现有字典,它要么崩溃,要么创建键的重复项(许多消息来源指出这是不可能的)。
有任何想法吗?谢谢!
- 编辑 -
pass 仅在打印之前存在,它不会影响结果
这是我从程序中得到的最后一个输出。非常抱歉字典键很长!
key not in self.currentDict
key in self.currentDict.keys()
key not in self.currentDict
self.currentDict = {
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.5): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.6): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.7): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.7): -88.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.2): -96.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.6): -168.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.1): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.5): -91.2,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.8): -102.39999999999999,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.7): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.3): -113.6,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.2): -80.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.1): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.3): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.5): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.6): -96.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.8): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.4): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.4): -80.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.8): -104.8030982226376,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.8): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.1): -120.0, # <---------------
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.2): -96.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.5): -97.6,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.2): -96.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.4): -120.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.3): -107.19999999999999,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.6): -88.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.7): -96.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.4): -104.0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.1): 0,
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.3): -88.0}
self.currentDict.keys() = [
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.5),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.6),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.7),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.7),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.2),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.6),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.1),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.5),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.8),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.7),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.3),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.2),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.1),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.3),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.5),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.6),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.8),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.4),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.4),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.8),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.8),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.1), # <-----------
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.2),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.5),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.2),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.4),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.3),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.6),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.7),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.4),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.1),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.3)]
和
key = (((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.1)
self.currentDict 的类型 =<type 'dict'>
我通过从文件中加载字典字典并将最后一个字典深度复制到 self.currentDict 来获取 self.currentDict。
我也执行了这段代码:
keyProblems = [k for k in self.currentDict.keys() if k not in self.currentDict]
print "keys with problems: %s" %(str(keyProblems))
它返回了这个结果:
keys with problems:
[(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.6),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.7),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.7),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.2),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.6),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.1),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.8),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.7),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.3),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.2),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.1),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.3),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.6),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.8),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.4),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.4),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.8),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.8),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 1.1),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.2),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.2),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.4),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.3),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.6),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.7),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 3.4),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 4.1),
(((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)), 2.3)]
澄清一下,上面的所有值(包括动作)都是离散的(没有重复的浮动)
将问题隔离在两个方法调用之间。这些方法是从应用程序中按顺序调用的。在第一种方法结束时,没有出现问题的键。第二种方法一开始,很多key都有问题(按照上面的代码)。现在的问题比以前更加神秘:/
更新:我在另一台笔记本电脑上测试了相同的程序,令人惊讶的是,即使运行了数十次,它也能完美运行,没有任何“关键问题”。这些是每台笔记本电脑上的配置:
笔记本电脑 1:
Windows 7 Home Premium Service Pack 1, 64-bit, i7-3610QM, 8GB RAM
Running under Eclipse with PyDev, application's internal Python: Crashes + key problems
Running directly from .bat file and outside Eclipse/Pydev, Pydev still installed: Crashes + key problems
Running under Eclipse with Pydev, using Python 2.7 installed in drive C: Crashes + key problems
Running directly from .bat file and outside Eclipse/Pydev, Pydev uninstalled: Crashes + key problems
笔记本电脑 2:
Windows 7 Ultimate Service Pack 1, 64-bit, Dual Core T5550, 4GB RAM
Pydev: Did not manage to test it with Pydev without having import errors
Running directly from .bat file and outside Eclipse/Pydev, Pydev installed: Works correctly even after tens of runs, list of key problems always empty
我正在为两台笔记本电脑使用项目目录的精确副本和相同的路径。对可能发生的事情有任何想法吗?