Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;在dict中;总是假的_Python_Dictionary - Fatal编程技术网

Python &引用;在dict中;总是假的

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选择(节点): 路径=[] 全球新

子节点中的节点始终为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选择(节点):
路径=[]
全球新,终端,找到
尽管如此:
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