Python 通过追加而不是包含引用在内容上创建列表副本

Python 通过追加而不是包含引用在内容上创建列表副本,python,list,nested-lists,Python,List,Nested Lists,首先,我想用这段代码来简化我的问题,但事实证明它实际上是按照我最初的预期工作的: list_a = [] list_b = [] for i in range(2): list_a = [i, i+1] list_b.append(list_a) 现在列表b是[[0,1],[1,2],正如我所希望的那样 我试图通过使用pygame制作一个简单的俄罗斯方块克隆来学习编程,我想使用类似的方法将文本文件解析为包含单个块的旋转/帧的列表(2d列表)。我填写一个2d框架,将其附加到所有框

首先,我想用这段代码来简化我的问题,但事实证明它实际上是按照我最初的预期工作的:

list_a = []
list_b = []
for i in range(2):
    list_a = [i, i+1]
    list_b.append(list_a)
现在
列表b
[[0,1],[1,2]
,正如我所希望的那样

我试图通过使用pygame制作一个简单的俄罗斯方块克隆来学习编程,我想使用类似的方法将文本文件解析为包含单个块的旋转/帧的列表(2d列表)。我填写一个2d
框架
,将其附加到所有框架的列表
框架
,然后重用
框架
。然而,与上述示例不同,当
frame
附加到
frames
时,它似乎不是
frame
的内容,而是对
frame
的引用(尽管这可能不是正确的术语?)。这有什么不同,它的行为不同,我如何使它工作?提前谢谢

class Block:

    object = {}

    def __init__(self, block_type):      
        frame = [[0 for i in range(4)] for i in range(4)]
        frames = []
        frames_file = open('files\\%s.txt' % block_type, 'r')

        for i, line in enumerate(frames_file):
            if line.strip() == '----':
                frames.append(frame)
                print(frame)
                print(frames)
                print('Append!\n')

            else:
                for x, char in enumerate(line.strip()):
                    y = i % 5
                    if char == '#':
                        frame[x][y] = 1
                    elif char == '.':
                        frame[x][y] = 0

        self.frame = frames

Block.object['T'] = Block('T')
现在,所有的
帧都包含相同的内容:

>>> Block.object['T'].frame[0] == Block.object['T'].frame[1]
True
请注意,
files\T.txt
是:

....
###.
.#..
....
----
.#..
##..
.#..
....
----
.#..
###.
....
....
----
.#..
.##.
.#..
....
----

经过仔细研究,并从已经删除其答案的用户那里得到了有用(尽管不完整)的提示,这基本上是

这里的问题有两方面:

  • frames.append(frame)
    实际上,在
    frames
    中只引用了
    frame
    ,我在任何时候都没有试图复制它
  • frames.append(frame[:]
    frames.append(list(frame))
    是复制列表的常用方法,它们不适用于该形式的嵌套列表
  • 正确的代码是:
    frames.append(list(list(i)表示帧中的i))