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))