You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中pop方法与字典构造行为:属CPython实现还是语法规定?

Python字典构造时参数处理顺序的规范性问题

我在IPython中做了如下测试,行为已十分明确:在第2行和第6行构造字典时,其行为如同调用dict(**kwargs),参数按从左到右的顺序处理,但该行为是CPython的实现细节,还是Python语法中明确规定的?

测试代码:

Python 3.12.2 (v3.12.2:6abddd9f6a, Feb  6 2024, 17:02:06) [Clang 13.0.0 (clang-1300.0.29.30)]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.22.2 -- An enhanced Interactive Python. Type '?' for help.

In [1]: x={"a":1, "b":2, "c":4}

In [2]: y= dict(z=x.pop("b"), **x)

In [3]: y
Out[3]: {'z': 2, 'a': 1, 'c': 4}

In [4]: x
Out[4]: {'a': 1, 'c': 4}

In [5]: x={"a":1, "b":2, "c":4}

In [6]: y= dict(**x, z=x.pop("b") )

In [7]: y
Out[7]: {'a': 1, 'b': 2, 'c': 4, 'z': 2}

In [8]: x
Out[8]: {'a': 1, 'c': 4}

回答

参数从左到右的处理顺序是Python语言规范明确规定的,并非CPython独有的实现细节。

Python官方文档明确规定,函数调用时所有参数表达式的求值顺序是从左到右的。在dict构造函数的调用中:

  • 对于dict(z=x.pop("b"), **x):先执行x.pop("b")移除x中的"b"键并赋值给z,再对**x进行解包,因此最终字典y中不会包含"b"键。
  • 对于dict(**x, z=x.pop("b")):先解包**x(此时x仍包含"b"键),再执行x.pop("b")添加z键,因此最终字典y中保留了"b"键。

另外,Python 3.5及以后版本允许在函数调用中混合使用**解包参数和关键字参数,且这种从左到右的参数处理规则是语言标准的一部分,所有符合Python规范的实现(比如PyPy、Jython)都必须遵循这一规则。


内容的提问来源于stack exchange,提问作者pbhowmick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:00:25