伙计们这很奇怪,可能是我未能看到的一些小错误:
所以我有一个字典,键作为元组。每个键都是(state,action)的元组,其中state是包含值和元组的元组。行动是一种价值。
我从文件加载我的字典并正确加载。在程序期间,它检查是否存在密钥。如果是,请更改该值,否则创建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)
我真的不知道为什么会这样。如果我启动一个新文件,程序运行并保存到文件,它可以正常工作。如果我使用现有文件,因此是现有字典,它会崩溃或创建重复的密钥(许多消息来源称这是不可能的)。
有什么想法吗?谢谢!
- 编辑 -
传递只是在打印之前,它不会影响结果
这是我从该计划获得的最后一项输出。非常抱歉,字典键很长!
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)]
只是为了澄清,上面的所有值(包括动作)都是离散的(没有重复浮动)
将问题隔离在两个方法调用之间。从应用程序顺序调用这些方法。在第一种方法结束时,没有问题的键。在第二种方法的最开始,很多键都有问题(根据上面的代码)。现在问题比以前更加神秘了:/
更新:我在另一台笔记本电脑上测试了相同的程序,令人惊讶的是,即使经过数十次运行,它也能完美运行,没有任何“关键问题”。这些是每台笔记本电脑的配置:
笔记本电脑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
我正在使用项目目录的精确副本和两台笔记本电脑的相同路径。关于可能发生的事情的任何想法?
答案 0 :(得分:0)
我认为你认为self.currentDict
和self.currentDict keys
之间存在差异...而且不知何故第一个给你元组的第一个元素,第二个元素给你第二个......
检查元组是否作为键存在:
if ('state', 'value') in self.currentDict
要分配,你应该这样做:
self.currentDict[('state', 'value')] = 'some value'
(注意:括号不是绝对必要的,但是imho会更清楚)