首先,这是我想用来以简化的方式呈现我的问题的代码,但事实证明它实际上是按照我最初预期的那样工作:
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}}
答案 0 :(得分:0)
经过一些挖掘并且已经删除了他的答案的用户提供了有用的(尽管不完整的)提示,这实际上是Copying 2D lists in python的重复
这里的问题有两个:
frames.append(frame)
确实只引用frame
中的frames
,我没有尝试在任何时候复制它frames.append(frame[:]
和frames.append(list(frame))
,这是复制列表的常用方法,不适用于该表单中的嵌套列表正确的代码是:frames.append(list(list(i) for i in frame))