这是我在
ipython
中尝试过的行为,其行为非常清晰:在第 3 行和第 6 行中创建字典时,字典的创建就像由 dict(**kwargs)
调用一样,并且 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}
指定参数是从左到右计算的。例如,文档的评估顺序section表示
中的子表达式expr1(expr2, expr3, *expr4, **expr5)
按照数字后缀建议的顺序进行评估。
但是,没有指定是否在评估后面的参数之前解包
*
或**
解包的参数。这种行为的细节甚至在 Python 3.9 中被意外改变,所以
a = [1, 2, 3]
print(*a, a.pop(0))
在 Python 3.8 和 3.9 上的行为有所不同。