10

Python リスト内の要素への「ポインター」を取得できるかどうか疑問に思っていました。そうすれば、要素のインデックスを知らなくても、要素に直接アクセスできます。つまり、リストでは要素をどこにでも追加できるということです。最初、途中、または最後でさえ、個々の要素は実際のメモリ位置から移動されません。理論的には、次のようなことができるはずです。

myList = [1]

[1]

element = &myList[0]

要素はここでポインタとして機能します。

myList.insert(0, 0)
myList.append(2)

[0、1、2]

この時点では、リスト内のインデックスが変更されていても、要素に直接アクセスできます。

これを行う理由は、私のプログラムでは、リストに追加するすべての項目を追跡するのは面倒すぎるからです。各アイテムはオブジェクトによって生成されます。時々、オブジェクトは値を更新する必要がありますが、アイテムが追加されたときと同じインデックスでアイテムを見つけることは保証できません。ポインターがあれば問題は解決します。それが理にかなっていることを願っています。

Pythonでそのようなことをする正しい方法は何でしょうか?

4

2 に答える 2

13

Pythonにはポインターの概念はありません(少なくとも私は知っています)。

リスト内にオブジェクトを保存する場合は、そのオブジェクトへの参照を保持するだけです。

プリミティブ値をリストに保存する場合、私がとるアプローチは、値/値の周りにラッパーオブジェクトを作成し、そのオブジェクトの参照を保持して、リストにアクセスせずに後で使用することです。このようにして、ラッパーは変更可能なオブジェクトとして機能し、どこからアクセスしても変更できます。

例:

class FooWrapper(object):
    def __init__(self, value):
         self.value = value

# save an object into a list
l = []
obj = FooWrapper(5)
l.append(obj)

# add another object, so the initial object is shifted
l.insert(0, FooWrapper(1))

# change the value of the initial object
obj.value = 3
print l[1].value # prints 3 since it's still the same reference
于 2013-02-16T00:40:43.987 に答える
1

element = mylist[0]要素を変更する必要がない場合、またはelement可変オブジェクトである場合は、すでに機能しています。

int変更できない Python のオブジェクトなどの不変オブジェクト。さらに、Python で複数の名前を使用して同じオブジェクトを参照できます。たとえば、sys.getrefcount(1)私のシステムの新しい REPL では ~2000 です。当然のことながら、これらすべての場所で突然1という意味にはなりたくありません。2

後でオブジェクトを変更する場合は、変更可能にする必要があります。たとえば、mylist[0] == [1]値を変更する場合は、 を設定できますelement[0] = 2。特定のアプリケーションには、リストの代わりにカスタム オブジェクトを使用する [1]方が適切な場合があります。

types.SimpleNamespace別の方法として、リストの代わりに辞書 (または などの他の名前空間オブジェクト) を使用できますmylist。次に、アイテムを変更するには、その名前で参照します: mydict["a"] = 2.

于 2016-04-28T12:53:02.303 に答える