考虑以下代码:
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"
,但是生成器本质上不应该创建新对象吗?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐