我想知道是否有可能获得python列表中元素的“指针”。这样,我就可以直接访问我的元素,而无需知道我的元素的索引。我的意思是,在列表中,您可以在任何地方添加元素;在开始,中间或甚至结束时,各个元素不会从其实际存储位置移动。理论上,应该可以做类似的事情:
myList = [1]
[1] 的
element = &myList[0]
元素将在此处充当指针。
myList.insert(0, 0)
myList.append(2)
[0,1,2]
此时,即使列表中的索引已更改,我仍然可以直接访问该元素。
我想要这样做的原因是因为在我的程序中,跟踪我添加到列表中的每个项目会非常繁琐。每个项目都由一个对象生成。偶尔,对象必须更新值,但不能保证它将在与添加时相同的索引处找到它的项。有一个指针可以解决问题。我希望这是有道理的。
在Python中做这样的事情的正确方法是什么?
答案 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
。