在不创建任何对象副本的情况下展平Python列表?

Jes*_*eTG 3 python arrays list flatten multidimensional-array

所以我正在用Python编写一个游戏,而我正在尝试解决的问题要求我将2D列表(即列表列表)转换为一维列表.我已经看到了几种方法,但我不知道是否有任何方法可以创建其中包含的任何对象的副本,或者只是新引用.说实话,Python标准库让我感到困惑,因为对象/序列是否被复制或者只是被引用填充并不总是显而易见的.

这些是关于我的特殊情况的假设;

  • 我们可以假设我的2D列表(如果表示为矩阵)是完全矩形的.
  • 如果我能得到一个上述假设不正确的解决方案,那就太好了,但目前并不需要.
  • 无需担心3D +列表.

谢谢!

DSM*_*DSM 7

虽然我不能说出你可能看到过的各种方式,但由于Python的对象语义,通常不会有任何副本.

>>> a = [[1,2.3,'3', object()], [None, [2,3], 4j]]
>>> b = [v for row in a for v in row]
>>> a
[[1, 2.3, '3', <object object at 0x1002af090>], [None, [2, 3], 4j]]
>>> b
[1, 2.3, '3', <object object at 0x1002af090>, None, [2, 3], 4j]
>>> [id(obj) for row in a for obj in row]
[4298185464, 4298195480, 4299558664, 4297781392, 4296523616, 4299692656, 4297773296]
>>> [id(obj) for obj in b]
[4298185464, 4298195480, 4299558664, 4297781392, 4296523616, 4299692656, 4297773296]
Run Code Online (Sandbox Code Playgroud)

v并不意味着"一些新的对象等于v",它只是意味着v,对象本身.