Python更改就地列表中的对象

Python更改就地列表中的对象,python,Python,这可能没有多大意义,但我想更改以下内容以显示'x',而不是'a' >>> a = "a" >>> b = "b" >>> c = "c" >>> d = [a, b, c] >>> d[0] = "x" >>> a 'a' 有可能有这种行为吗?不仅对于字符串,对于其他对象也是如此。您实际要做的是将a、b和c作为引用传递给d[]。然后,d引用这些字符串而不是变量 它不在乎a、b或c等于什么

这可能没有多大意义,但我想更改以下内容以显示
'x'
,而不是
'a'

>>> a = "a"
>>> b = "b"
>>> c = "c"
>>> d = [a, b, c]
>>> d[0] = "x"
>>> a
'a'

有可能有这种行为吗?不仅对于字符串,对于其他对象也是如此。

您实际要做的是将a、b和c作为引用传递给d[]。然后,d引用这些字符串而不是变量

它不在乎a、b或c等于什么。您在注释中给出了一个示例,但在这样运行时它实际上不起作用:

>>> a = "a"
>>> b = "b"
>>> c = "c"
>>> d = [a, b, c]
>>> a = "x"
>>> a
'x'
>>> d
['a', 'b', 'c']
>>> c = 12
>>> c
12
>>> d
['a', 'b', 'c']

变量是对象的标签

d
是标签列表

a
是对象的标签<代码>'a'是一个不可变的对象。如果要更改
a
以显示
'x'
,则必须更改它所指向的内容:

>>> a = 'x'
>>> a
'x'
或:


a
x

a = "a"
b = "b"
c = "c"
d =[a,b,c]
d[0] = "x"
a = d[0]
print a

输出是
x

字符串在Python中是故意不可变的

您可以选择将字符串存储在可变容器中,或者使用其他可变的数据类型

本例将每个字符串存储在一个可变容器中(您自己的类或eg的另一个列表)

将打印“x”

但是,在这种情况下,
bytearray
可能是更好的选择

a = bytearray(b'abc')
a[2] = ord(b'x')
a = chr(a[2])
print(a)

也将打印“x”。

不,您不能,因为当您分配
l=[a,b,c]
时,您将
a
的值放在
l
中,而不是
a

Perharps是最贴切的东西:

class ref:
    value=0
    def __init__(self,x):
        self.value=x
    def __repr__(self):
        return repr(self.value)

a=ref('a')
b=ref('b')
c=ref('c') 
l=[a,b,c]
l[0].value='x'
print(a)
>>>> 'x'

如果Python本身没有重大的变化,这是不可能的。字符串是不可变的,因此根据定义不能就地更改。推荐阅读:正如@jornsharpe所说,python文本(数字/字符串)是不可变的,只有像object/list这样的复杂类型是可变的,@number5不太准确:。。。还有可变和不可变的映射和序列。@jornsharpe这与可变有什么关系?您可以为变量指定另一个值,对吗?这正是我想做的,只是列表中对对象的引用你说的“为什么它工作”是什么意思?!因为您正在分别更改
d[0]
a
!请阅读Ned Batcheld的文章,这将有助于消除您对Python赋值工作方式的困惑。谢谢,似乎您是少数阅读其他对象部分的人之一。这不正确,repr必须返回字符串。(无法确定)值=0的
是什么意思?这似乎是个错误。
a = bytearray(b'abc')
a[2] = ord(b'x')
a = chr(a[2])
print(a)
class ref:
    value=0
    def __init__(self,x):
        self.value=x
    def __repr__(self):
        return repr(self.value)

a=ref('a')
b=ref('b')
c=ref('c') 
l=[a,b,c]
l[0].value='x'
print(a)
>>>> 'x'