词典理解与常规词典创建的语义差异:为什么<dictcomp><lambda>的行为不同于<lambda>?

2024-04-20 08:00:11 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下代码:

d = {
    **{
        keyword: lambda: print(name)
        for (keyword, name) in [
                ("a", "alice"),
                ("b", "bob"),
        ]
    },
    "c": lambda: print("carol")
}

>>> d["c"]()
"carol"

>>> d["a"]()
"bob"

>>> d["b"]()
"bob"

我最初的假设是,词典理解应该被认为是和句法抽象没有任何区别的东西。你知道吗

我现在很困惑:为什么d["a"]()不打印“alice”?你知道吗

我的期望是keyword: lambda: print(name)应该在内部列表的每次迭代之后创建一个新的lambda函数,显然它确实做到了:

>>> print(d)
{'a': <function <dictcomp>.<lambda> at 0x7f33d5cb4158>, 'b': <function <dictcomp>.<lambda> at 0x7f33d5cb4048>, 'c': <function <lambda> at 0x7f33d4bfad08>}

'a''b'创建的lambda函数的地址是不同的(这也是id(d['a']) != id(d['b'])id保证对象唯一性的情况)。你知道吗

我得到,在内部dict comprehension是列表理解的dict的一个应用程序,它本身是基于生成器表达式的,这可能会暗示为什么d["a"]()d["b"]()都打印"bob",后者是列表上的最后一个,但不是"alice",但是生成器本质上不应该创建新对象吗?你知道吗


Tags: 对象lambda函数nameid列表functionkeyword