10

我想知道是否有可能获得指向 python 列表中元素的“指针”。这样,我就可以直接访问我的元素,而无需知道我的元素的索引。我的意思是,在列表中,您可以在任何地方添加元素;在开始、中间甚至结束时,单个元素并没有从它们的实际内存位置移动。从理论上讲,应该可以执行以下操作:

myList = [1]

[1]

element = &myList[0]

element 将在此处充当指针。

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是可变对象,则已经可以使用。

不可变对象,例如intPython 中的对象,您无法更改。此外,您可以在 Python 中使用多个名称来引用同一个对象,例如,sys.getrefcount(1)在我系统上的新 REPL 中是 ~2000。自然,您不想12所有这些地方突然出现。

如果您想稍后更改对象,那么它应该是可变的,例如,如果mylist[0] == [1]要更改值,您可以设置element[0] = 2. 自定义对象而不是 [1]列表可能更适合特定应用程序。

作为替代方案,您可以使用字典(或其他名称空间对象,例如types.SimpleNamespace)而不是mylist列表。然后要更改项目,请通过其名称引用它:mydict["a"] = 2

于 2016-04-28T12:53:02.303 回答