Python在对象行为中做出了决定?

时间:2014-03-02 19:32:26

标签: python dictionary

我正在尝试使用其邻居的名称和dict创建一个节点类,以及它引用此邻居的标记(不一定是邻居的名称)。

class node:
def __init__(self,name='',neighbors={}):
    self.name=name
    self.neighbors=neighbors

def addNeighbor(self,neighborTag,neighbor):
    if neighborTag not in self.neighbors.keys():
        self.neighbors[neighborTag] = neighbor

但是当我执行以下操作时:

foo = node(name='foo')
foo.addNeighbor('fooneighbor',node(name='bar'))

dict条目{'fooneighbor',节点对象}也出现在foo.neighbors ['fooneighbor']。邻居(我希望是空白的)。

我猜这与我不知道的dicts如何工作有关。谁能开导我?

1 个答案:

答案 0 :(得分:0)

引自docs

  

在函数定义时计算默认参数值   执行。这意味着当表达式被评估一次   定义函数,并使用相同的“预先计算”值   每次通话。这对了解何时来说尤为重要   default参数是一个可变对象,例如列表或字典:   如果函数修改了对象(例如通过将项附加到a   列表),默认值实际上已修改。这通常不是   意图是什么。解决这个问题的方法是使用None作为默认值,   并在函数体中明确地测试它,例如:

def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin

所以,你可以解决你的问题,比如

def __init__(self,name='',neighbors=None):
    self.name=name
    if neighbors == None:
       neighbors = dict() 
    self.neighbors=neighbors