如何在python中将列表中的值分配给对象

如何在python中将列表中的值分配给对象,python,python-3.x,Python,Python 3.x,我有以下陈述: A = "s" B = ["1", "2", "3"] 当我打印B[2]时,我想得到对象“A”,例如:print(B[2]),答案将给出“A”,并引用A的值 我如何用python实现它 如有任何建议,将不胜感激 谢谢大家 同样的问题以另一种方式提出: 我在论坛上看到了这一点: >>>foo = 'a string' >>>id(foo) 4565302640 &

我有以下陈述:

A = "s"
B = ["1", "2", "3"]
当我打印B[2]时,我想得到对象“A”,例如:
print(B[2])
,答案将给出“A”,并引用A的值

我如何用python实现它

如有任何建议,将不胜感激

谢谢大家

同样的问题以另一种方式提出:

我在论坛上看到了这一点:

>>>foo = 'a string'
>>>id(foo) 
4565302640
>>> bar = 'a different string'
>>> id(bar)
4565321816
>>> bar = foo
>>> id(bar) == id(foo)
True
>>> id(bar)
4565302640
但如果我有:

>>> foo = "a string"
>>> id(foo)
36591240
>>> bar = ["1", "2", "3"]
>>> id(bar)
39186840
>>> bar[2] = foo
>>> id(bar) == id(foo)
Flase

如何在列表中指定一个值来匹配不同的对象?

您需要的是
id(bar[2])==id(foo)
。这将成为现实


通常,列表是可变的,因此您可以指定希望特定列表元素为的任何值。

我不确定为什么要这样做,但定义一个新的
列表
类可能会有所帮助:

class NewList(list):
    def __init__(self, mapping):
        self._mapping = mapping
        list.__init__(self)
        
    def __getitem__(self, key):
        item = list.__getitem__(self, key)
        return self._mapping[item]
然后,您可以在定义映射后将其用作列表,该映射显示了哪个项目对应于哪个对象:

A = "s"
mapping = {"3": A}

B = NewList(mapping)
B.extend(["1", "2", "3"])  

print(B[2])
输出:

s

TL;DR
B[2]=A

您需要了解,在python中,字符串对象是不可变的对象, 这意味着这些对象无法更改,它们的行为与可变对象不同

因此,在定义字符串之后,将创建一个对象。但由于该对象是不可变的,因此,如果将其他变量指定给同一对象,则在更改原始变量时,您正在创建一个新对象,而不是更改所创建的对象

对于可变对象,赋值与您通常所做的一样 例如,看看这个:

In [1]: A = ['s']

In [2]: B = ['1','2','3']

In [3]: B[2] = A

In [4]: id(B[2]) == id(A)
Out[4]: True
对于您的示例,您可以定义一个新类而不是字符串

In [1]: class MutableString:
   ...:     def __init__(self, value):
   ...:         self.value = value
   ...:     def __str__(self):
   ...:         return self.value
   ...:     def __repr__(self):
   ...:         return repr(self.value)
   ...:

In [2]: A = MutableString('foo')

In [3]: B = ['1', '2', '3']

In [4]: B[2] = A

In [5]: print(B)
['1', '2', 'foo']

In [6]: A.value = 'bar'

In [7]: print(B)
['1', '2', 'bar']

In [8]: id(B[2]) == id(A)
Out[8]: True

有什么原因不能将
a
放在列表中吗
B=[“1”,“2”,A]
在不使用函数或类的代码中,您几乎只限于Andrew所说的。我不能将A放在列表中,因为我希望A将保持其自身的对象,而B将是另一个对象。如何使用函数或类将“3”与A匹配?将
A
放入列表中不会以任何方式阻止
A
成为“它自己的对象”。