获取指向列表元素的指针

11 投票
2 回答
45958 浏览
提问于 2025-04-17 16:03

我在想,能不能在Python的列表中获取一个“指针”指向某个元素。这样的话,我就可以直接访问这个元素,而不需要知道它在列表中的位置。我的意思是,在一个列表里,你可以在任何地方添加元素;可以在开头、中间,甚至末尾,但这些元素在内存中的位置是不会改变的。理论上,我应该可以这样做:

myList = [1]

[1]

element = &myList[0]

在这里,element就相当于一个指针。

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

[0, 1, 2]

即使这个元素在列表中的位置发生了变化,我仍然可以直接访问它。

我想这样做的原因是,在我的程序中,跟踪我添加到列表中的每个项目会非常麻烦。每个项目都是由一个对象生成的。偶尔,这个对象需要更新值,但不能保证它会在添加时的同一个位置找到它的项目。有了指针,这个问题就能解决了。我希望这样说能让你明白。

在Python中,怎么才能做到这一点呢?

2 个回答

1

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

15

在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

撰写回答