一个关于Python流行的问题以及语法要说什么?

问题描述 投票:0回答:1

这是我在

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}

python dictionary grammar
1个回答
0
投票

指定参数是从左到右计算的。例如,文档的评估顺序section表示

中的子表达式
expr1(expr2, expr3, *expr4, **expr5)

按照数字后缀建议的顺序进行评估。

但是,没有指定是否在评估后面的参数之前解包

*
**
解包的参数。这种行为的细节甚至在 Python 3.9 中被意外改变,所以

a = [1, 2, 3]
print(*a, a.pop(0))

在 Python 3.8 和 3.9 上的行为有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.