我正在尝试实现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();
}
});
});
那么我错过了什么以及如何解决此错误?
答案 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
您需要记住的内容:永远不要将参数默认为可变对象。