【发布时间】:2022-01-07 22:14:44
【问题描述】:
我已经寻找过类似的讨论,但我找不到任何 - 所以这里是:
基本上,我想要一个列表,比如说,预先分配给 10 个值:
mylist = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
然后,我想定义两组值,我希望 mylist 大部分时间在我的代码中“切换”;说:
valsA = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 )
valsB = ( 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 )
由于这些是预定义的值集,因此将它们定义为列表毫无意义,因此将它们定义为元组。
现在,我原则上可以这样做:
# some code running here ...
# switch mylist to valsA:
mylist = valsA
# some more code using mylist running here ...
# switch mylist to valsB:
mylist = valsB
# some more code using mylist running here ...
...然而,问题是,仅仅通过直接赋值,mylist 就变成了元组的标识符:
>>> valsA = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 )
>>> valsB = ( 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 )
>>> mylist = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
>>> id(valsA)
123145300863808
>>> hex(id(valsA))
'0x6fffffe9eb40'
>>> hex(id(valsB))
'0x6fffffeb81c0'
>>> hex(id(mylist))
'0x6fffffea9bc0'
>>> mylist = valsA
>>> hex(id(mylist))
'0x6fffffe9eb40'
>>> type(mylist)
<class 'tuple'>
...因此,在这样的分配之后,如果我的代码想要更改 mylist 中的单个插槽/项目/条目,它将无法更改,因为它现在是一个不可变的元组:
>>> mylist
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> mylist[2] = 15
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
所以,相反,我正在寻找一种有效的方法来复制元组的值 - 比如说,对我来说最明显的方法是:
>>> mylist = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] # reset
>>> for tidx, tval in enumerate(mylist): mylist[tidx] = valsA[tidx]
...
>>> print(mylist)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
... 然后允许更改 mylist 中的单个项目:
>>> mylist[2] = 15
>>> print(mylist)
[0, 1, 15, 3, 4, 5, 6, 7, 8, 9]
...但是,我必须经历一个 Python 级别的循环,从早期的经验来看,这不一定是最快的做事方式;而且,它不一定是最易读的(尽管我总是可以将它包装在一个函数/方法中——但是我有函数调用的开销)。
有没有比运行for 循环更有效的方法将值从元组复制到列表?说,也许有类似(伪代码)mylist.fill(valsA) 方法或其他方法?
【问题讨论】:
-
这能回答你的问题吗? Convert tuple to list and back
-
感谢@Amongalen - 不太确定;我确定
mylist = list(valsA)会更改mylist指向的结构的ID,但我还不能确定它是否与我的问题有关;所以我会关注调用list()的开销是否比运行复制值的循环更多(或更少),如this question;但我看不到链接的问题在哪里讨论。 -
我自己没有测试过,但我猜这个内置方法的性能是你能得到的。您还确定这里的性能很重要吗?提防过早的优化。