Python reference problem
我在python中遇到了一个非常奇怪的问题。
我有一个叫做菜单的班级:(代码片段)
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
当我实例化这个类时,我传入一个字典列表。使用此函数创建字典:
1 2 3 4 | def menu_item(description, action=None): if action == None: action = lambda : None return {"description": description,"action": action} |
然后按如下方式创建列表:
1 2 3 4 5 6 7 8 9 10 | 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运行了这个程序,发现一旦创建了一个类的另一个实例,以前所有类的菜单项就会设置为最新的列表。菜单项成员似乎是静态成员。
我在这里监督什么?
1 2 3 4 5 6 7 8 9 | 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回答了你的问题,这里有一些随机的建议:
1 2 3 4 5 6 | 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)) |