Python引用问题

标签 python reference

我在 Python 中遇到了一个(对我来说)非常奇怪的问题。

我有一个名为 Menu 的类:(片段)

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 字典是一个在所有 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 tutorial section on classes以获得关于类属性和实例属性之间差异的更彻底的讨论。

关于Python引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1867068/

相关文章:

.net - Lucene.Net 突出显示不起作用

c++ - 我还应该传递类成员数据作为速度引用吗?

swift - 在 swift 中为 CloudKit 数据库设置引用值

reference - 如何在 Visual Studio 2013 中访问 NuGet 包管理器?

python - 如何在 MySQL Workbench 中使用 Python 脚本执行 SQL 查询

python with object 模拟多个with对象

python - 从文件夹导入 Python 插件

java - 如何在更改原始引用变量后再次引用 Java 对象

python - 不同主机的结构参数不同

python - FFmpeg:组合了4个mp4视频的output.mp4不能保持原来的帧率