1

编辑:案件结案。请参阅下面选择的答案以获取解决方案(感谢 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

谁能解释这里发生了什么?为什么布尔值如此奇怪?

4

1 回答 1

2

这里有几个问题,其中之一是您正在创建所有节点,如下所示:

parent = node()
fchild = node()
schild = node()
wchild = node()
cchild = node()

但稍后在您的代码中,您有如下几行:

wchild = parent

我怀疑这是(部分)你的问题。由于变量在 Python 中的工作方式,现在变量wchildparent都指向同一个对象。当您对 的字段进行比较和操作时wchild,您现在也在对 的字段进行操作parent

举个例子:

parent = node()
wchild = node()
parent.farmer = True
wchild = parent
if wchild.farmer:
  print "Farmer"

应该打印出“Farmer”。

此外,在 Python 中进行否定的更好方法如下:

wchild.wolf = not wchild.wolf

希望这可以帮助!

编辑:更清楚地回答评论:如果要将值从父级复制到子级,可以node像这样为类定义一个方法:

def copy(self, child_node):
  child_node.farmer = self.farmer

其他领域以此类推。这样,您可以像这样创建副本:

parent = node()
child = node()
parent.farmer = True
parent.copy(child)

现在child.farmerTrue了,你可以改变它而不改变parent.farmer

于 2013-10-01T22:34:42.977 回答