Python引用问题 reference

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运行了这个程序,发现一旦创建了一个类的另一个实例,以前所有类的菜单项就会设置为最新的列表。菜单项成员似乎是静态成员。

我在这里监督什么?


menu_itemsdict是在所有Menu实例之间共享的类属性。改为这样初始化它,您应该可以:

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回答了你的问题,这里有一些随机的建议:dictzip是非常有用的函数:—)

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))