Python 将条目添加到数据结构是重复的
我正在尝试实现一个R树数据结构,我有以下Python 将条目添加到数据结构是重复的,python,Python,我正在尝试实现一个R树数据结构,我有以下RNodeLeaf类: class RNodeLeaf(object): def __init__(self, entries=[]): self._entries = entries def addEntry(self, e): self._entries.append(e) 我想向我创建的节点分发一些数据。考虑这段代码: nodes = [] for i in range(8):
RNodeLeaf
类:
class RNodeLeaf(object):
def __init__(self, entries=[]):
self._entries = entries
def addEntry(self, e):
self._entries.append(e)
我想向我创建的节点分发一些数据。考虑这段代码:
nodes = []
for i in range(8):
if i % 4 == 0:
node = RNodeLeaf()
nodes.append(node)
node.addEntry(5)
print(nodes)
print(nodes[0]._entries)
print(nodes[1]._entries)
因此,我假设创建了2个rnodeleaf
,这是真的,因为我打印了print(nodes)
,它们都有4个元素。
但是在我打印print(节点[x].\u条目)
之后,我很惊讶,因为它们都是相同的数据
[5,5,5,5,5,5,5,5]
那么,我遗漏了什么,可以做些什么来修复这个错误呢?我尝试了一下,得到了同样的结果。如果以这种方式调用init(),它将工作:
node = RNodeLeaf(entries=[])
我想,这是因为每个变量都是全局的和公共的,但我不确定。
当您第一次调用init()时,它会创建“条目”,当您这样做时:
self.\u entries=entries
它不会创建新对象,它只会得到一个指向“条目”的指针。因此,在节点的addEntry(5)
中,它将其添加到“entries”中。第二个节点也做同样的事情,得到一个指向“entries”的指针,这就是为什么得到两个具有相同列表的节点。我尝试了它,得到了相同的结果。如果以这种方式调用init(),它将工作:
node = RNodeLeaf(entries=[])
我想,这是因为每个变量都是全局的和公共的,但我不确定。
当您第一次调用init()时,它会创建“条目”,当您这样做时:
self.\u entries=entries
它不会创建新对象,它只会得到一个指向“条目”的指针。因此,在节点的addEntry(5)
中,它将其添加到“entries”中。第二个节点也做同样的事情,得到一个指向“entries”的指针,这就是为什么得到两个具有相同列表的节点。您的问题是将参数设置为默认值[]
。
读信号作为副本。
基本上,定义为[]
的\uuuu init\uuu
行中的列表在代码中的任何地方都是相同的。
因此,在每个其他节点的entries
属性中将看到节点中条目的修改
因此,您需要将\uuuuu init\uuuu
更改为:
def __init__(self, entries=[]):
self._entries = entries
致:
您需要记住的是:永远不要将参数默认为可变对象。您的问题是将参数默认为[]
。
读信号作为副本。
基本上,定义为[]
的\uuuu init\uuu
行中的列表在代码中的任何地方都是相同的。
因此,在每个其他节点的entries
属性中将看到节点中条目的修改
因此,您需要将\uuuuu init\uuuu
更改为:
def __init__(self, entries=[]):
self._entries = entries
致:
您需要记住的是:永远不要将参数设为可变对象的默认值。几乎可以肯定这一点:要修复它,请将条目=[]
更改为条目=无
,如果条目为无,则添加:条目=[]
节点=[]
是问题所在,但我太懒了,找不到源代码来将其标记为副本。它得到一次评估,所以它总是同一个列表。使用节点[0]进行验证。\u条目是节点[1]。\u条目
-它们在内存中是完全相同的对象,而不仅仅是相等的。几乎可以肯定这一点的可能重复:要修复它,请将条目=[]
更改为条目=None
,如果条目为None,则添加条目=[]
问题在于节点=[]
,但我太懒了,找不到源代码来将其标记为副本。它得到一次评估,所以它总是同一个列表。使用节点[0]进行验证。\u项为节点[1]。\u项
-它们在内存中是完全相同的对象,而不仅仅是相等的。可能是重复的