Python: область действия переменной и инкапсуляция списка

#python

#python

Вопрос:

У меня есть карта классов (упрощенная):

 from Enums import *
import Globals
import Tile

class Map:
    tiles = []  #the actual map, it's a 2D list of Tile objects
    for x in range(Globals.mapWidth):
        for y in range(Globals.mapHeight):
            self.tiles[x][y].addItem(Items.Foliage)
 

И плитка класса:

 class Tile:
    items=[]
    def __init__(self, type):
        self.type = type

    def addItem(self,i):
        self.items.append(i)
 

Моя проблема в том, что массив items[] из плитки класса, похоже, является общим для каждого экземпляра класса. Например, в конце циклов FOR
print(len(self.tiles[x][y].items)
верните 25 для каждого тайла. Почему это так? У меня должно быть 25 списков размером 1, но вместо этого размер списка в цикле увеличивается с 0 до 25. Может кто-нибудь объяснить мне, что здесь происходит? Большое спасибо за помощь 🙂

Ответ №1:

Your items является атрибутом класса, поэтому он, по-видимому, является общим для всех экземпляров.

 class Tile:
    def __init__(self, type):
        self.items = []
        self.type = type
 

Комментарии:

1. Это сработало, спасибо! Я приму ваш ответ, когда веб-сайт позволит мне

2. Скажите, пока вы здесь, как я могу проверить, возвращает ли list.index() ошибку? Я не могу найти это в Google.

3. @gramm, используй попытку / исключение docs.python.org/tutorial/errors.html#handling-exceptions

4. @gramm: try: my_list.index(x); except ValueError: handle_error()