Python &引用;在dict中;总是假的
子节点中的节点始终为false 但在调试器中:Python &引用;在dict中;总是假的,python,dictionary,Python,Dictionary,子节点中的节点始终为false 但在调试器中: (pdb) children.keys() ... turn: 1, last: (5, 2), hash: 5837165650205296398, ... (pdb) node turn: 1, last: (5, 2), hash: 5837165650205296398 (pdb) node in children False (pdb) node.__eq__(node) True 这是函数 def\u选择(节点): 路径=[] 全球新
(pdb) children.keys()
...
turn: 1, last: (5, 2), hash: 5837165650205296398,
...
(pdb) node
turn: 1, last: (5, 2), hash: 5837165650205296398
(pdb) node in children
False
(pdb) node.__eq__(node)
True
这是函数
def\u选择(节点):
路径=[]
全球新,终端,找到
尽管如此:
path.append(节点)
如果节点不在子节点中:new+=1;返回路径
如果不是子节点[节点]:端子+=1;返回路径;
未探索=子节点[node]-子节点.keys()
如果未勘探:
发现+=1
n=未探索的.pop()#忽略最佳路径?
path.append(n)
返回路径
#节点=_uct_select(节点)
else:node=choice(元组(子项[未探索])
下面是散列函数和eq函数
def\uuuu散列(self):
“节点必须是可散列的”
返回散列(元组(self.board.flatte()))
定义(节点1、节点2):
“节点必须具有可比性”
返回node1.board就是node2.board
电路板只是一个[6,7]阵列问题在于您的
eq
功能。除非它们是完全相同的列表,否则它们的对象ID相等is
将返回false<代码>是与=
board_b = [6,7]
board_a = [6,7]
print(board_a is board_b)
print(board_a == board_b)
印刷品
False
True
有关主题的更多信息,请参见。我从您的问题和评论中猜测,
节点。board
是一个numpy数组;如果你明确地提到这一点,会有帮助的。numpy数组上的=
操作符(即\uuuuu eq\uuuu()
)确实有一些令人惊讶的行为:它返回一个布尔值的numpy数组,而不是一个布尔值
>>> import numpy as np
>>> a = np.array([1, 2])
>>> b = np.array([1, 2])
>>> a == b
array([ True, True])
但是,is
操作符不能用作替代,因为这两个数组不是同一个对象:
>>> a is b
False
因此,在这种情况下,您需要使用numpy.array_equal(node1.board,node2.board)
:
你的节点似乎不太可能是相等的,因为我不认为
node1.board就是node2.board
是真的-但是,如果不知道更多关于节点是如何构造的,就不可能知道。你的意思是node1.board是node2.board
而不是node1.board==node2.board
?@Amadan它确实产生了真的结果。我已将此添加到question@Thomas使用“==”生成一个布尔数组,而“is”生成一个布尔数组,您正在使用is
check。这意味着只有当两个电路板相同时,\uuuuu eq\uuu
才是真的,而不是当它们有不同但相同的电路板时。为了重申我之前的示例,[1,2]is[1,2]
返回false。如何获得单个布尔值而不是布尔数组?这是否意味着如果它们是不同的对象,我就不能使用is None
?我不知道你这个问题的意思。你什么时候得到一个布尔数组?我正在使用某个对象为None
来查看我代码中其他地方的对象是否为NoneType
。如果NoneType
对象和None
是不同的对象,这是否总是会产生False
?是无
是正常的,可以正常使用。没有一个是像单例一样的关键字和函数<代码>无为无将始终为真
>>> np.array_equal(a, b)
True