我用Python创建了一个图节点类 每个节点都有单个父节点,多个子节点和属性 实现应如下所示:
# graph_test.py
class Node(object):
def __init__(self, name, prop={}):
self.name = name
self.properties = prop
self.parent = None
self.children = []
print "New node:", self.name, self.properties
def add_prop(self, k, v):
self.properties.update({k:v})
print "added prop:", k, v
def add_child(self, n):
self.children.append(n)
n.parent = self
class Foo(object):
def __init__(self, n):
self.node_num = n
self.root_node = None
self.current_node = None
def bas(self):
n = Node("root")
n.add_prop("this_prop_is", "set_only_root_node")
self.root_node = n
return self.root_node
def bar(self):
self.current_node = self.bas()
for i in range(self.node_num):
n = Node(str(i))
self.current_node.add_child(n)
self.current_node = n
if __name__ == '__main__':
f = Foo(5)
f.bar()
在此代码中,预计只有根节点具有其键为“this_prop_is”的属性。
但是,执行结果如下:
$ python ./graph_test.py
New node: root {}
added prop: this_prop_is set_only_root_node
New node: 0 {'this_prop_is': 'set_only_root_node'}
New node: 1 {'this_prop_is': 'set_only_root_node'}
New node: 2 {'this_prop_is': 'set_only_root_node'}
New node: 3 {'this_prop_is': 'set_only_root_node'}
New node: 4 {'this_prop_is': 'set_only_root_node'}
即使我将其添加到节点“root”,所有节点都具有相同的密钥。
我使用python 2.7.6
。
我的问题是:
答案 0 :(得分:2)
这不是错误。问题是c1 = cast[cast.title == 'The Pink Panther']
c2 = c1.groupby('year')[['n']].max()
type(c2)
的默认值。您将其设置为空字典。但是,此空字典将通过prop
引用进行复制,修改后,下次创建新self.properties = prop
时,修改后的字典将用作默认值。
要解决此问题,请将None设置为默认值,并在分配属性时选中None:
Node
答案 1 :(得分:1)
这是因为Node.__init__
中有一个可变的默认值。在Python中,默认值是在创建函数时确定的,并且将始终使用相同的实例。因此,每次创建新的Node
并且不为其提供明确的prop
参数时,它将使用相同的字典。
这通常通过使用None
作为默认值来解决,并且如果参数为None
,则每次在函数内创建新字典,例如通过执行self.properties = prop or {}
。 (如果你给它一个空字典,这也将使用一个新字典,但这不是通常一个问题)
答案 2 :(得分:0)
将props={}
更改为props=None
,将self.properties = prop
更改为self.properties = prop or {}
这是由于Python中可变的默认参数的行为。这是一个很好的资源来阅读:http://effbot.org/zone/default-values.htm