获取指向列表元素的指针

时间:2013-02-16 00:23:30

标签: python list pointers

我想知道是否有可能获得python列表中元素的“指针”。这样,我就可以直接访问我的元素,而无需知道我的元素的索引。我的意思是,在列表中,您可以在任何地方添加元素;在开始,中间或甚至结束时,各个元素不会从其实际存储位置移动。理论上,应该可以做类似的事情:

myList = [1]

[1]

element = &myList[0]

元素将在此处充当指针。

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

[0,1,2]

此时,即使列表中的索引已更改,我仍然可以直接访问该元素。

我想要这样做的原因是因为在我的程序中,跟踪我添加到列表中的每个项目会非常繁琐。每个项目都由一个对象生成。偶尔,对象必须更新值,但不能保证它将在与添加时相同的索引处找到它的项。有一个指针可以解决问题。我希望这是有道理的。

在Python中做这样的事情的正确方法是什么?

2 个答案:

答案 0 :(得分:12)

没有关于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

答案 1 :(得分:1)

如果您不需要更改元素或element = mylist[0]是可变对象,

element已经有效。

Python中的int对象等不可变对象无法更改。此外,您可以在Python中使用多个名称引用相同的对象,例如,sys.getrefcount(1)在我的系统上的新REPL中是~2000。当然,您并不希望1在所有这些地方突然意味着2

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

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