为什么 Python 在定义变量时自动转换为元组?

why Python auto cast int to tuple while define variable?

我正在学习 python,使用 w3schools python 教程,阅读如何 python “多值到多变量” 和被下面的Casting过程搞糊涂了

>>> a=b,c=d = 1,2
>>> print(a,b,c,d)
(1, 2) 1 2 (1, 2)
>>> print(type(a),type(b),type(c),type(d))
<class 'tuple'> <class 'int'> <class 'int'> <class 'tuple'>
>>> x,y,z,t = 1,2,3,4
>>> print(type(x),type(y),type(z),type(t))
<class 'int'> <class 'int'> <class 'int'> <class 'int'>
>>> print(x,y,z,t)
1 2 3 4
>>>

a,d 的类型 'tuple'?

我研究的时候还以为是'int'

当你做的时候

a=b,c=d = 1,2

发生以下情况

d = 1,2 # now d is 2-tuple
b,c=d # 2-tuple is unpacked, now b is 1 and c is 2
a=b,c # new 2-tuple a is created using b and c, now a is 2-tuple (1,2)

来自语言参考的第 7.2 节,Assignment statements

An assignment statement evaluates the expression list (remember that this can be a single expression or a comma-separated list, the latter yielding a tuple) and assigns the single resulting object to each of the target lists, from left to right.

第一个赋值语句

a = b, c = d = 1, 2

^     ^    ^    ^
|     |    |    +-- expression list
|     |    +-- target #3
|     +-- target #2
+-- target #1

由表达式列表1, 2(计算结果为一个元组)和三个目标ab, cd组成,它们在下面分配订单:

a = 1, 2
b, c = 1, 2
d = 1, 2

不涉及铸造。 ad 的赋值直接赋给元组; bc 的赋值将每个目标与元组中的相应值配对。


也许最值得注意的是,它是 而不是 ,就像在 C 中一样,在 C 中,赋值被认为是一个表达式,其值是被赋值的值。 C 中的 a = b = c = d 等同于

/* C with explicit parentheses
 * d is assigned to c, with the value of c = d assigned
 * to b, and the value of b = c = d assigned to a
 */
a = (b = (c = d))

而在 Python 中它是单个 语句 具有上面定义的语义。

C 中的一个常见习惯用法是在条件语句中使用赋值的值,这样您就可以将被测试的值绑定到稍后在同一语句中使用的变量。

while ((c = foo()) != bar) {
    printf("%s\n", c)
}

在Python中引入赋值表达式之前,等价的在之前需要一个单独的赋值语句while 语句:

c = foo()
while c != bar:
    print(c)
    c = foo()
    

或者更通俗地说,一个带有显式中断条件的无限循环

while True:
    c = foo()
    if c == bar:
        break
    print(c)

使用赋值表达式,您现在可以将赋值嵌入到类似于 C 示例的 boolean-valued 表达式中。

while (c := foo()) != bar:
    print(c)

我认为添加 () 包围元组会更清楚。这个

a = (b, c) = d = (1, 2)
print(type(a), type(b), type(c), type(d))
print(a, b, c, d)

等同于

a = b, c = d = 1, 2
print(type(a), type(b), type(c), type(d))
print(a, b, c, d)

所以你从左到右将一个元组(1, 2)分配给三个目标a(b, c)d(b, c) 只是 unpacks 值,因此 b 被分配到第一个值,而 c 被分配到 (1, 2) 的最后一个值。所有其他变量 i。 e. ad 只是分配元组 (1, 2)