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

4
以下代码打印“original value”。我想在列表中存储一个字符串的引用,以便存储在列表中的字符串和first_string始终指向同一对象。我该如何在Python中实现它?我想要存储一个引用,最好是一个弱引用,在列表中。列表应该是不同类型的对象引用的列表。我只是在测试如何在Python中做不同的事情以及可能性。这是Python可以实现的吗?
my_list = []

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

first_string = 'changed'

print(my_list[0])

应该打印出 "changed"。

...

我尝试使用弱引用获取字符串:

weakref.ref(first_string)

但是显然无法对字符串对象进行弱引用。

cannot create weak reference to 'str' object

尽管存储id是一个不好的想法(因为对象可能被CG而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中是无法实现的吗?


你需要它做什么?Python中的字符串是不可变的,因此它们不能被更改(但其他字符串可以绑定到相同的名称)。如果您需要数据结构来保存不同的字符串,请使用类似字典的结构或将该字符串属性作为类的一部分(并将对象保存在列表中)。 - m.wasowski
事实上,字符串的不可变性是许多Python新手经常遇到的问题。 - aruisdante
Bytearrays是可变的,顺便提一下。由于字节数组可以保存字节,因此它可以保存任何ASCII字符串。(因此它与Python 2的字符串对象完全兼容,但不兼容Python 3的多字节字符串。) - kojiro
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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接