2014-01-21 3 views
1

У меня возникли проблемы с написанием кода для текстовой RPG в Python. Эта RPG использует класс для каждого местоположения и функцию для сканирования каталога игр для карт и добавления их в большой трехмерный список. Каждый элемент этого трехмерного списка представляет собой список, содержащий 4 значения: координаты, имя, краткое описание и необработанные данные для карты.Координаты назначены неправильно (Python 3.3)

Однако, когда я использую функцию для обновления этой карты, несмотря на то, что она работает правильно, при печати элемента списка он не отображает ожидаемые значения.

У меня есть 4 тестовых файла map.txt в подкаталогах папки my/maps, для каждой из которых я проверил тройную проверку точности координат.

Я свели задачу к коде ниже:

# Imports: 
import os 
import sys 
from random import randint 


# Definitions 

def create_maps_list(): 
    """Creates a blank list of 100*100*100 zeros.""" 
    x_list, y_list, z_list, attr_list = [], [], [], [] 

    for _ in range(4): 
     attr_list.append(0) 

    for _ in range(100): 
     z_list.append(attr_list) 

    for _ in range(100): 
     y_list.append(z_list) 

    for _ in range(100): 
     x_list.append(y_list) 
    global maps_list 
    maps_list = x_list 

def update_maps_list(maps_list): 
    """Updates maplist by scanning the maps dir.""" 
    listdirs = os.listdir(os.getcwd() + "\maps") # List folder names in /maps 
    for mapdir in listdirs: 
     mapfile = open("maps/{0}/map.txt".format(mapdir)) # Open map.txt 
     linelist = list(mapfile) 
     desc = open("maps/{0}/description.txt".format(mapdir)).read() 
     mapdata = linelist[2:] 
     name = linelist[1] 
     coordsline = linelist[0] 
     coords = [] 
     for num in coordsline.split(): 
      coords.append(int(num)) 
     x = coords[0] 
     y = coords[1] 
     z = coords[2] 
     print("Name: ", name, "Assigned to coords: ", coords, "\n") 
     maps_list[x][y][z] = [coords, name, desc, mapdata] 
    return maps_list 


# Assignments: 
maps_list = [] 
list_data = [] 


# Execution 
create_maps_list() 
maps_list = update_maps_list(maps_list) 


# Output 
print() 
print("Expected output: [0, 0, 0] Initial Building.") 
print(maps_list[0][0][0][0], maps_list[0][0][0][1]) 

Фактический выход следующим образом:

Name: East Building 
Assigned to coords: [1, 0, 0] 

Name: Heaven! 
Assigned to coords: [0, 0, 1] 

Name: Initial Building 
Assigned to coords: [0, 0, 0] 

Name: North Building 
Assigned to coords: [0, 1, 0] 


Expected output: [0, 0, 0] Initial Building. 
[0, 1, 0] North Building 

[Finished in 0.3s] 

Любая помощь будет высоко ценится (в том числе, которые непосредственно не связаны с вопросом - У меня есть скрытое подозрение, что хранение координат таким образом - не лучший способ сделать что-то!)

+0

Посмотреть этот вопрос: http://stackoverflow.com/questions/1959744/python-list-problem – happydave

ответ

1

Ваш x_list содержит 100 ссылок на один y_list. Поэтому изменение одного из них заставит его выглядеть так, как будто все они изменились. Аналогично, ваш y_list содержит 100 ссылок на один z_list.

Вы, вероятно, хотите что-то вроде этого:

maps_list = [[[[0 for i in range(4)] for z in range(100)] for y in range(100)] for x in range(100)] 
+0

Кроме того, в отношении вопроса о том, как сохранить со- ординаты. Если вы не планируете заполнять около миллиона записей, которые вы назначаете, вам, вероятно, лучше хранить их как dict, где ключ является кортежем (x, y, z). – happydave

+0

И последний 4-элементный список должен, вероятно, быть его собственным классом. Но это проблема удобочитаемости/ремонтопригодности, а не проблема с памятью или производительностью. – happydave