Справочная проблема Python

Я испытываю (для меня) очень странную проблему в Python.

У меня есть класс под названием Menu: (snippet)

class Menu: """Shows a menu with the defined items""" menu_items = {} characters = map(chr, range(97, 123)) def __init__(self, menu_items): self.init_menu(menu_items) def init_menu(self, menu_items): i = 0 for item in menu_items: self.menu_items[self.characters[i]] = item i += 1 

Когда я создаю экземпляр класса, я перехожу в список словарей. Словари создаются с помощью этой функции:

 def menu_item(description, action=None): if action == None: action = lambda : None return {"description": description, "action": action} 

И тогда списки создаются следующим образом:

 t = [menu_item("abcd")] m3 = menu.Menu(t) a = [ menu_item("Test")] m2 = menu.Menu(a) b = [ menu_item("Update", m2.getAction), menu_item("Add"), menu_item("Delete")] m = menu.Menu(b) 

Когда я запускаю свою программу, я каждый раз получаю те же пункты меню. Я запустил программу с помощью PDB и узнал, как только будет создан еще один экземпляр класса, элементы menu_items всех предыдущих классов установлены в последний список. Кажется, что элемент menu_items является статическим членом.

Что я здесь наблюдаю?

Элемент menu_items dict – это атрибут класса, который разделяется между всеми экземплярами Menu . Инициализируйте его вот так, и вы должны быть в порядке:

 class Menu: """Shows a menu with the defined items""" characters = map(chr, range(97, 123)) def __init__(self, menu_items): self.menu_items = {} self.init_menu(menu_items) [...] 

Посмотрите раздел руководства Python по классам для более подробного обсуждения различий между атрибутами класса и атрибутами экземпляра.

Поскольку Pär ответил на ваш вопрос, вот несколько случайных советов: dict и zip – чрезвычайно полезные функции 🙂

 class Menu: """Shows a menu with the defined items""" characters = map(chr, range(97, 123)) def __init__(self, menu_items): self.menu_items = dict(zip(self.characters, menu_items))