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
相关产品推荐
相关产品推荐

