在列表中存储对字符串的引用

4 投票
1 回答
2215 浏览
提问于 2025-04-18 02:37

下面的代码会打印出“原始值”。我想在列表中存储一个字符串的引用,这样列表中的字符串和first_string总是指向同一个对象。我该如何在Python中做到这一点?我想在列表中存储一个引用,最好是一个弱引用。这个列表应该包含对不同类型对象的引用。我只是想测试一下在Python中可以做些什么,看看有什么可能性。这在Python中能实现吗?

my_list = []

first_string = 'original value'
my_list.append(first_string)

first_string = 'changed'

print(my_list[0])

它应该打印出“已更改”。

...

我尝试通过以下方式获取字符串的弱引用:

weakref.ref(first_string)

但显然,无法对字符串对象获取弱引用。

cannot create weak reference to 'str' object

尽管存储id是个坏主意(因为一个对象可能会被垃圾回收,这样id就可能指向一个不同的对象),我还是尝试了:

import ctypes
my_list = []

first_string = 'original value'
my_list.append(id(first_string))

ctypes.cast(my_list[0], ctypes.py_object).value = 'changed value'

print(first_string)

结果也不行。打印的值仍然是原始值。那么,这在Python中真的无法实现吗?

1 个回答

2

你想在Python中做的事情只能在可变类型上进行。如果两个“标签”指向同一个可变对象,你在一个标签上做的操作会在访问另一个标签时看到,因为它们指向的是同一个对象。简单来说,把它放在一个列表或类里面就可以了--

>>> class PyString:
    def __init__(self,string):
        self.string = string
>>> first_string = PyString("original_value")
>>> my_list = []
>>> my_list.append(first_string)
>>> first_string.string = "changed"
>>> my_list[0].string
'changed'

撰写回答