Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将条目添加到数据结构是重复的_Python - Fatal编程技术网

Python 将条目添加到数据结构是重复的

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):

我正在尝试实现一个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):

            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项
-它们在内存中是完全相同的对象,而不仅仅是相等的。可能是重复的