2013-08-17 5 views
1

Я столкнулся с проблемой с моим кодом, который я просто не могу понять.Словарь не заселен правильно

В соответствии с приведенной ниже секции кода:

После создания 2-го словаря (worldmap) в Generate_Game_World классе, расположение HQ хранится в

self.worldmap[HQLOCATIONX,HQLOCATIONY]["Region_Type"] = "HQ" 

Однако, после того, как сделать это, кажется, чтобы заполнить весь массив со значением «HQ», как показано в тестовом окне. Я просто не могу понять, почему это происходит.

import pygame 
from tkinter import * 

test = Tk() 
test.geometry = ("640x480") 

pygame.init() 

WORLDSIZE = 499 
HQLOCATIONX = int(WORLDSIZE/2) 
HQLOCATIONY = int(WORLDSIZE/2) 

class Generate_Game_World(): 

    regionData = {"Region_Type" : "None", 
        "Region_Level" : 0} 

    def __init__(self, mapSize): 
     self.mapSize = mapSize 

    def main (self): 
     # creates 2d map 
     self.worldmap = {(x,y) : self.regionData for x in range(self.mapSize) for y in range (self.mapSize)} 

     # Sets the HQ to worldmap(249,249) 
     self.worldmap[HQLOCATIONX,HQLOCATIONY]["Region_Type"] = "HQ" 

     # checks worldmap(0,0) --> (10,10) for its Region Type 
     for x in range (10): 
      for y in range (10): 
       label = Label (text=self.worldmap[x,y]["Region_Type"]).grid(row = x, column=y) 

class Game (object): 
    def main (self, screen): 
     gameworld = Generate_Game_World(WORLDSIZE)  
     gameworld.main() 

     while 1: 

      for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        return 

       if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
        return 

      test.mainloop() 
      pygame.display.flip() 

if __name__ == "__main__": 
    screen = pygame.display.set_mode((1024, 768)) 
    Game().main(screen) 

ответ

2

Все ваши словарные значения ссылки на один класса-атрибута regionData.

Вы хотите создать копии вместо:

self.worldmap = {(x,y): self.regionData.copy() for x in range(self.mapSize) for y in range (self.mapSize)} 

Это использует dict.copy() method создать неполную копию вместо; этого достаточно, так как значения Generate_Game_World.regionData представляют собой простые строки, и они неизменяемы, поэтому их можно безопасно использовать.

Вы также можете использовать словарь для создания нового словаря с нуля; Вы, похоже, не использовать self.regionData нигде так встраивание возможность:

self.worldmap = {(x,y): {"Region_Type" : "None", "Region_Level" : 0} 
       for x in range(self.mapSize) for y in range (self.mapSize)} 

Последнее, но не менее, вы имели в виду использовать None одноплодной вместо строки "None" возможно?

+0

Код, который я предоставил, является лишь фрагментом из большей части проекта, изолируя область, которая причиняет мне неприятности. Ключи используются для отображения фрагментов, на которые они ссылаются. None.png, HQ.png и т. Д. – Jess

+0

@ Джесс: Правильно, в этом случае вы хотите создать копии словаря. Если ваш словарь 'regionData' содержит другие изменяемые значения, вместо этого используйте' copy.deepcopy() '. –

+0

Я потратил больше 2 часов, пытаясь понять это, и вы помогли мне сэкономить еще много часов. Благодаря :) – Jess