通过追加而不是包含引用来对列表进行列表复制

时间:2014-02-05 20:58:50

标签: python list nested-lists

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

list_a = []
list_b = []
for i in range(2):
    list_a = [i, i+1]
    list_b.append(list_a)

现在list_b[[0, 1], [1, 2]],正如我希望的那样。

我正在尝试通过使用pygame制作一个简单的俄罗斯方块克隆来学习编程,我想使用类似的方法将文本文件解析为包含单个块(2d列表)的旋转/帧的列表。我填写了2d frame,将其附加到frames,这是所有帧的列表,然后重复使用frame。但是,与上面的示例不同,似乎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') 不正确的术语?)。这有什么不同,它表现不同,我如何使其工作?提前谢谢!

frame

现在所有>>> Block.object['T'].frame[0] == Block.object['T'].frame[1] True 都包含相同的内容:

files\T.txt

仅供记录,.... ###. .#.. .... ---- .#.. ##.. .#.. .... ---- .#.. ###. .... .... ---- .#.. .##. .#.. .... ---- 是:

{{1}}

1 个答案:

答案 0 :(得分:0)

经过一些挖掘并且已经删除了他的答案的用户提供了有用的(尽管不完整的)提示,这实际上是Copying 2D lists in python的重复

这里的问题有两个:

  1. frames.append(frame)确实只引用frame中的frames,我没有尝试在任何时候复制它
  2. frames.append(frame[:]frames.append(list(frame)),这是复制列表的常用方法,不适用于该表单中的嵌套列表
  3. 正确的代码是:frames.append(list(list(i) for i in frame))