为什么在Python字典生成器中会出现这种行为?

为什么在Python字典生成器中会出现这种行为?,python,dictionary,syntax,Python,Dictionary,Syntax,为什么在第一种情况下,字典键被覆盖,而在第二种情况下,值被覆盖 >>> a = {'a': 1, 'b': {'c': 3}} >>> {None if v.__class__ == dict else k: v for k, v in a.items()} {'a': 1, None: {'c': 3}} >>> {k: v if v.__class__ != dict else None for k, v in a.items()} {'

为什么在第一种情况下,字典键被覆盖,而在第二种情况下,值被覆盖

>>> a = {'a': 1, 'b': {'c': 3}}
>>> {None if v.__class__ == dict else k: v for k, v in a.items()}
{'a': 1, None: {'c': 3}}
>>> {k: v if v.__class__ != dict else None for k, v in a.items()}
{'a': 1, 'b': None}

您仅根据条件选择键,无论是否执行,值都保持不变。括号将使其更具可读性

{(None if v.__class__ == dict else k): v for k, v in a.items()}

如果我们重写为标准循环,情况可能会变得更清楚(请注意,我使用了
isinstance
作为更好的类检查):

选项1

d = {}
for k, v in a.items():
    d[None if isinstance(v, dict) else k] = v
d = {}
for k, v in a.items():
    d[k] = None if isinstance(v, dict) else v
选项2

d = {}
for k, v in a.items():
    d[None if isinstance(v, dict) else k] = v
d = {}
for k, v in a.items():
    d[k] = None if isinstance(v, dict) else v
显然,前者是在修改键,后者是在修改值


您没有说您实际想要发生什么,但是如果您试图跳过
k:v
对,其中值是字典,即:

d = {}
for k, v in a.items():
    if not isinstance(v, dict):
        d[k] = v
那么“字典理解”等价物将如下所示:

{k: v for k, v in a.items() if not isinstance(v, dict)}

请注意,在的
之后出现的
if
条件充当过滤器。

因为if…else比:。这很好,因为否则你会有{('a':1),没有},这不是一个格言

你可能想要

{k: v for k, v in a.items() if not isinstance(v, dict)}
但要小心:你真的只是在这里挑出口述吗?或者任何映射?或者任何不是整数的东西?或者…

请参见以下内容中的语言规范:

如果您分析dict comprehension
None If v.。\uuu class\uuuuu==dict else k:v代表k,v代表a.items()
它必须与
表达式:表达式comp\u形式匹配。那么让我们来看看
的补偿可能是什么。它指出,
comp\u for
必须以
for
开头,其中只有一个for,因此
中的k,v。items()
是comp的
,其余的必须在
表达式:expression
表单上,但是只有一个冒号,所以第一个表达式(即键)是如果v.uuu class_uuu==dict else k
和第二个(即值)
v
,则将为
None。
if
else
是条件表达式的一部分


理解意味着,对于
a中的每个
k,v
。项
与键
None
形成一个键值对,如果
v.。\uu class\uuuuuuuuuuu
==dict和
k
,否则值为
v
{(如果v.\uu class\uuuuuuuuu==dict else k,则无):v表示…}
vs.
{k:(v如果v.\uuuuu class\uuuu!=dict else None)for…}
。你为什么期望它不会有什么不同?!如果您想跳过具有字典值的键,那么它应该是
{k:v代表k,v在a.items()中,如果不是isinstance(v,dict)}
,这两者都是:将条件放在正确的位置;以适当的方式测试字典。