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

2024-10-05 11:13:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下陈述:

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

如何在列表中指定值以匹配不同的对象


Tags: 对象答案idtrue列表stringfoo方式
3条回答

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

通常,列表是可变的,所以您可以为特定列表元素指定任何值

我不知道为什么要这样做,但是定义一个新的list类可能会有帮助:

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;DRB[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

相关问题 更多 >

    热门问题