2014-02-05 1 views
2

Чтобы начать, это код, который я хотел использовать, чтобы представить мою проблему в упрощенном виде, но оказывается, что он действительно работает, поскольку я изначально ожидал, что вещь, чтобы работать:Выполнение копирования списка содержимого через добавление, а не содержащее ссылку

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]], как я хочу, чтобы это было.

Я пытаюсь изучить программирование, сделав простой клон Tetris с 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 s содержат то же самое:

>>> Block.object['T'].frame[0] == Block.object['T'].frame[1] 
True 

Просто для записи, files\T.txt является:

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

ответ

0

Через некоторое копаться и полезным (хотя неполный) намек от пользователя, который уже удалил свой ответ, это по существу дубликат Copying 2D lists in python

Проблемы была двоякой:

  1. frames.append(frame) действительно только ссылки на framesframe, я не пытался скопировать его в любой точке
  2. frames.append(frame[:] и frames.append(list(frame)), которые являются обычными способами копирования списка, не работает для вложенных списков в этой форме

правильный код: frames.append(list(list(i) for i in frame))