gpt4 book ai didi

python - 当使用 **kwargs 语法从 2 个不同的字典形成单个字典对象时,试图理解模糊的行为

转载 作者:太空宇宙 更新时间:2023-11-04 03:39:25 24 4
gpt4 key购买 nike

我试图理解一段代码,该代码涉及在调用函数时使用 **kwargs。在阅读了 Pydocs 和 Stackoverflow 上的其他一些帖子后,我尝试以交互方式试验这种语法,但遇到了一些我无法理解其行为的情况:

In [180]: d1 = {'a':'b', 'c':'d'}

In [181]: d2 = {'e':'f', 'g':'h', 'i':'j'}

In [182]: dict(d1, d2)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-182-49f16d5922b6> in <module>()
----> 1 dict(d1, d2)

TypeError: dict expected at most 1 arguments, got 2

In [183]: dict(d1, **d2)
Out[183]: {'a': 'b', 'c': 'd', 'e': 'f', 'g': 'h', 'i': 'j'}

In [184]: dict(d1, *d2)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-184-0d16a1c0b887> in <module>()
----> 1 dict(d1, *d2)

TypeError: dict expected at most 1 arguments, got 4

In [185]: dict(*d1,d2)
File "<ipython-input-185-d36e77e65d5e>", line 1
dict(*d1,d2)
SyntaxError: only named arguments may follow *expression


In [186]: dict(**d1,d2)
File "<ipython-input-186-fd4b93fcc3c9>", line 1
dict(**d1,d2)
^
SyntaxError: invalid syntax

在我目前正在研究的代码中,我看到正在使用 In [183]​​ 的语法以及目前我对 **d2 的理解,当它是像这样使用的是它将字典对象 d2 扩展到一个看起来像 (e=f, g=h, i=j) 的元组中,所以语句对于 In [183]​​ 可能看起来像(我不确定是哪一个,但我厌倦了我能想到的所有可能性,但没有一个可行,这让我感到困惑):

In [192]: dict({'a':'b', 'c':'d'}, (e=f, g=h, i=j))
File "<ipython-input-192-792b64fb793a>", line 1
dict({'a':'b', 'c':'d'}, (e=f, g=h, i=j))
^
SyntaxError: invalid syntax

对于上面的内容,我认为包围 e=f, g=h, i=j 的方括号可能是问题所在,因为它有效:

In [191]: dict(a=5,l=6)
Out[191]: {'a': 5, 'l': 6}

但是当我删除它们时,我得到:

In [196]: dict({'a':'b', 'c':'d'}, e=f, g=h, i=j)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-196-854a7d483a98> in <module>()
----> 1 dict({'a':'b', 'c':'d'}, e=f, g=h, i=j)

NameError: name 'f' is not defined

仅尝试 e=f, g=h, i=j 部分是行不通的:

In [197]: dict(e=f, g=h, i=j)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-197-b53d153dfd98> in <module>()
----> 1 dict(e=f, g=h, i=j)

NameError: name 'f' is not defined

然后我意识到将 '' 放在 f、h 和 i 周围解决了问题:

In [199]: dict(e='f', g='h', i='j')
Out[199]: {'e': 'f', 'g': 'h', 'i': 'j'}

所以我想我在这里发现的是,key=value 对的右侧不需要定义为字符串或任何对象类型,但为什么会这样呢?

当我回到最初的问题时,我有

In [200]: dict({'a':'b', 'c':'d'}, e='f', g='h', i='j')
Out[200]: {'a': 'b', 'c': 'd', 'e': 'f', 'g': 'h', 'i': 'j'}

终于成功了!

抱歉,如果我不清楚我的问题是什么,那么总结一下,我将列出我所有的问题:

  1. 当我执行 In [183]​​: dict(d1, **d2) 时,它是如何工作的,而且我没有收到任何与参数数量相关的错误,而对于 In [182]: dict(d1, d2)In [184]: dict(d1, *d2) 我有错误告诉我我已经投入了更多dict 的参数比它接受的参数多? d1, **d2 是如何变成一个参数的?

  2. 从执行 In [185]: dict(*d1,d2)In [186]: dict(**d1,d2),显然第一个字典对象有 *** 是行不通的。为什么不能这样做?例如,为什么 dict(**d1, d2) 不做与 dict(d1, **d2) 相同的事情?

  3. 与 Q1 有点相关 - 根据我对 **kwargs 的理解,它以某种方式将字典扩展到它的 key = value 并应用于例如,可能给了我类似 In [200]: dict({'a':'b', 'c':'d'}, e='f', g='h', i= 'j') 因为它运行正确。但这看起来不像有 4 个参数吗?为什么这没有引发错误?

  4. 我的最后一个问题是,为什么当使用 key = value 对语法作为 dict 的参数时,我们不需要包含 key 在任何引号中,但只对 value 这样做,尽管键本身也是一个 string 对象,这在成功的 的输出中很明显dict 构造?

非常感谢大家的帮助,如果有任何意见或建议可能与我的问题没有直接关系,我也将不胜感激。这种行为对我来说太晦涩了,我无法理解!

最佳答案

如果您阅读文档 ( https://docs.python.org/2/library/stdtypes.html#typesmapping ),该行为一点都不难理解

请记住,当您调用 dict() 时,您是在调用一个函数。函数具有定义数量的参数,并且这些参数具有定义的顺序。

dict()一共有三个定义,分别是:

dict(**kwargs)
dict(iterable, **kwargs)
dict(mapping, **kwargs)

这只是语言的设计方式。这应该可以回答您在 (1) 和 (2) 中的问题。

编辑:对于 (3),您认为它扩展了键/值对是正确的。 **kwargsn 个命名参数,因此当您传递 i=1, j=2, k=3 时,您传递的是 3命名参数。如果一个函数以 **kwargs 作为参数定义,这意味着它可以接收 0 到 n 命名参数。普通参数和命名参数之间存在区别。

对于 (4),这只是一个编译器技巧。我猜这是为了方便,但实际上很少使用。我个人还没有看到“现实世界”中使用的 key=value 约定。 YMMV.

关于python - 当使用 **kwargs 语法从 2 个不同的字典形成单个字典对象时,试图理解模糊的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27221600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com