编辑:案件结案。请参阅下面选择的答案以获取解决方案(感谢 rnorris!)
提出的问题如下。
我对我的问题有了一些了解,现在我认为问题更多是关于如何在 Python 中设置彼此相等的事物,但仅限于值。据我了解,我遇到了问题,因为我想首先将孩子设置为与其父母相同,然后根据需要进行更改。问题是当我说
child = parent
它使它们引用内存中的相同空间,因此对子值的任何更改都会成为对父值的更改。有没有办法将子级设置为等于父级,同时仍然允许单独编辑它们的值?
原始问题如下。
这是关于我的布尔项目的另一个问题。我试图弄清楚为什么我的项目以一种奇怪的方式表现。对于一个很长的问题,我深表歉意,希望您能帮助我!
我的项目是为图形搜索建模,我的问题是父母和孩子。它的工作原理是在父节点上最多可以采取四种可能的操作来生成新的子节点:将“farmer”从真翻转为假(反之亦然),然后翻转farmer和其他三个布尔值中的任何一个,狼,羊和卷心菜,但前提是它们等于农民(即如果狼和农民都为真,则将它们都翻转以生成一个新孩子)。在我最初的父节点的情况下,所有四个布尔值都是假的,所以应该有四个子节点,每个事件一个。
#boolfliptest
class node:
def __init__(self):
self.farmer, self.wolf, self.sheep, self.cabbage = False, False, False, False
self.parent = None
self.cost = 0
parent = node()
fchild = node()
schild = node()
wchild = node()
cchild = node()
fchild = parent
fchild.farmer = (True, False)[fchild.farmer]
fchild.parent = parent
fchild.cost += 1
if(parent.farmer == parent.wolf):
wchild = parent
wchild.farmer != wchild.farmer
wchild.wolf != wchild.wolf
wchild.parent = parent
wchild.cost += 1
if(parent.farmer == parent.sheep):
schild = parent
schild.farmer != schild.farmer
schild.sheep != schild.sheep
schild.parent = parent
schild.cost += 1
if(parent.farmer == parent.cabbage):
cchild = parent
cchild.farmer != cchild.farmer
cchild.cabbage != wchild.cabbage
cchild.parent = parent
cchild.cost += 1
print parent.farmer, parent.wolf, parent.sheep, parent.cabbage
print fchild.farmer, fchild.wolf, fchild.sheep, fchild.cabbage
print wchild.farmer, wchild.wolf, wchild.sheep, wchild.cabbage
print schild.farmer, schild.wolf, schild.sheep, schild.cabbage
print cchild.farmer, cchild.wolf, cchild.sheep, cchild.cabbage
这确实发生了,因为我正在使用打印行打印出父级和四个子级的四个布尔值。它们应该如下所示:
False False False False #parent
True False False False #farmer flip only
True True False False #farmer and wolf flip
True False True False #farmer and sheep flip
True False False True #farmer and cabbage flip
但相反,我只得到这个:
% python boolfliptest.py
False False False False
False False False False
False False False False
False False False False
False False False False
我想也许我使用了一种糟糕的方法来切换布尔值,显然我是,作为原始方法
schild.farmer != schild.farmer #taken from above
不工作。我用这种切换布尔值的新方法只替换了 fchild 翻转语句
fchild.farmer = (True, False)[fchild.farmer]
我确实得到了更好的结果,但不是我所期望的。结果是这样的:
% python boolfliptest.py
True False False False
True False False False
False False False False
False False False False
False False False False
fchild(列表中的第二个)确实像我预期的那样正确翻转,但父节点也是如此,它应该保持全部错误!
我尝试了另一件事。我注释掉了 fchild.farmer bool 翻转线,而是使用 wchild bools 的新方法。IE:
if(parent.farmer == parent.wolf):
wchild = parent
wchild.farmer = (True, False)[wchild.farmer]
wchild.wolf = (True, False)[wchild.wolf]
wchild.parent = parent
wchild.cost += 1
这个结果同样令人困惑。wchild 翻转工作正常,但它是为 fchild 和 parent 复制的,两者都不应该改变。
% python boolfliptest.py
True True False False
True True False False
True True False False
False False False False
False False False False
谁能解释这里发生了什么?为什么布尔值如此奇怪?