获取指向列表元素的指针
我在想,能不能在Python的列表中获取一个“指针”指向某个元素。这样的话,我就可以直接访问这个元素,而不需要知道它在列表中的位置。我的意思是,在一个列表里,你可以在任何地方添加元素;可以在开头、中间,甚至末尾,但这些元素在内存中的位置是不会改变的。理论上,我应该可以这样做:
myList = [1]
[1]
element = &myList[0]
在这里,element就相当于一个指针。
myList.insert(0, 0)
myList.append(2)
[0, 1, 2]
即使这个元素在列表中的位置发生了变化,我仍然可以直接访问它。
我想这样做的原因是,在我的程序中,跟踪我添加到列表中的每个项目会非常麻烦。每个项目都是由一个对象生成的。偶尔,这个对象需要更新值,但不能保证它会在添加时的同一个位置找到它的项目。有了指针,这个问题就能解决了。我希望这样说能让你明白。
在Python中,怎么才能做到这一点呢?
2 个回答
element = mylist[0]
这行代码已经可以用了,如果你不需要改变这个元素,或者如果 element
是一个可以改变的对象。
在Python中,一些不可改变的对象,比如 int
类型的数字,是不能被修改的。而且,你可以用多个名字来指向同一个对象,比如在我的系统中,运行 sys.getrefcount(1)
会得到大约2000。这意味着你不希望在所有地方突然让 1
变成 2
。
如果你想以后能改变一个对象,那它就应该是可改变的,比如说,如果 mylist[0] == [1]
,那么要改变这个值,你可以用 element[0] = 2
。在某些特定的应用中,使用一个自定义对象而不是 [1]
这个列表可能会更合适。
另外,你也可以用字典(或者其他命名空间对象,比如 types.SimpleNamespace
)来代替 mylist
列表。这样要改变某个项目时,可以通过它的名字来引用:mydict["a"] = 2
。
在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