如何在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
成为“它自己的对象”。