向数据结构添加条目是重复的

时间:2017-07-12 14:39:17

标签: python

我正在尝试实现R-Tree数据结构,并且我有以下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)

我想将一些数据分发给我创建的节点。考虑这段代码:

RNodeLeafs

所以我的假设是创建了2 print(nodes)这是真的,因为我打印print(nodes[x]._entries)并且它们都有4个元素。 但是在我打印[5,5,5,5,5,5,5,5] 之后我很惊讶,因为他们都是相同的数据。

jQuery(document).ready(function() {

  function addLogoToMiddle() {
    var middle = Math.ceil($(".navbar-nav li").length / 2);
    var logoListItem = $('#logo-wrapper').appendTo('<li id="logo-item"></li>');
    $(".navbar-nav li:nth-child(" + middle + ")").after(logoListItem);
  }

  function addLogoToSide() {
    $('#small-screen-logo').append($('#logo-wrapper'));
    // don't forget to remove the list item element from the navbar
    $('#logo-item').remove();
  }

  $(window).resize(function() {
    if ($(window).width() > 980) {
      addLogoToMiddle();
    } else {
      addLogoToSide();
    }
  });

  $(document).ready(function() {
    if ($(window).width() > 980) {
      addLogoToMiddle();
    }
  });

});

那么我错过了什么以及如何解决此错误?

2 个答案:

答案 0 :(得分:1)

我试了一下,得到了同样的结果。如果以这种方式调用 init (),它将起作用:

node = RNodeLeaf(entries=[])

我认为,这是因为每个变量都是全球性的和公开的,但我不确定。 You can read about default parameters here.当您第一次创建“条目”时调用 init ()时,当您执行此操作时:self._entries = entries它不会创建新对象,它只会获得一个指向'条目'的指针。因此,在node.addEntry(5),它会将其添加到“条目”中。第二个节点做同样的事情,得到一个指向'entries'的指针,这就是为什么你得到2个具有相同列表的节点。

答案 1 :(得分:1)

您的问题是您将参数默认为[]。 阅读this post作为重复信号。 基本上,定义为__init__的{​​{1}}行中的列表在代码中的任何位置都是相同的。 因此,在每个其他节点的[]属性中都会看到节点中entries的修改。

因此,您需要更改entries

__init__

为:

def __init__(self, entries=[]):
    self._entries = entries

您需要记住的内容:永远不要将参数默认为可变对象。