mgilsonの分析に同意します。list
は可変タイプでlist.append
あり、インプレースです。これが意味することです:
可変と不変の2つのタイプがあります。
変更可能なタイプは、変更した場合でも、メモリ上の同じ場所に存在します。たとえば、list
sとsは可変型です。dict
これは、を作成しlist
て特定の方法で変更した場合でも、メモリ内の同じ場所に存在することを意味します。list
したがって、 「myList」という名前を作成するとします。このリストをメモリ位置0x9000にあるとしましょう。次に、実行してもメモリ内myList.append(0)
の場所は変更されません。myList
行ったとしてもmyList[0] = 'a'
、場所は変更されません-それは0x9000でまだ生きています。
不変タイプは、何らかの方法で変更しようとすると、別のメモリ位置に「移動」します。str
sとtuple
sは不変です。これが、次のエラーが発生する理由です。
>>> s = 'as'
>>> s[0] = 'b'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
これは、あなたが定義し(そして今はメモリアドレス0x5000に住んでいるs = 'as'
としましょう)、それをとして再定義したとしても、メモリ内の場所が変わることを意味します。s
s = 'af'
s
これで、可変タイプを再割り当てすると、メモリ内の位置が変わります。例えば、
L = [1,2,3]#メモリ位置0x4000と言うL = [5,6,7]#メモリ位置は0x4000ではなくなった
list.append
ここで、 「インプレース」であるという特性が発揮されます。「list.append
インプレース」とは、新しいリストを作成せずに、新しい要素がリストに追加されることを意味します。これが、list.append
以下に示すように、戻り値がない理由です。
>>> L = [1,2,3]
>>> ret = L.append(4)
>>> print L
[1, 2, 3, 4]
>>> print ret
None
ただし、新しいリストを作成する場合は、次のように行うことができます。
>>> L = [1,2,3]
>>> ret = L + [4]
>>> print L
[1, 2, 3]
>>> print ret
[1, 2, 3, 4]
したがって、あなたのケースで起こっていることは、両方の再帰呼び出し(左と右)でpoint
、各再帰呼び出しのリストに追加されるということです。これが、重複する値を取得する理由です。
mgilsonが提案することを実行することでこれを回避できます。または、Lispファンの場合(これは非常に優れたLispの質問です)、[1,2,3] + [4]
原則を使用してこれを実行できます(テストされていませんが、機能するはずです)。
def within_radius(self, point, radius, result=[]):
"""
Find all items in the tree within radius of point
"""
d = self.discriminator
temp = []
if in_circle(point, radius, self.data):
temp = [self.data]
# Check whether any of the points in the subtrees could be
# within the circle
if point[d] - radius < self.data[d] and self.l_child:
temp += self.l_child.within_radius(point, radius, result)
if point[d] + radius > self.data[d] and self.r_child:
temp += self.r_child.within_radius(point, radius, result)
return result+temp
お役に立てれば