为什么 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
(计算结果为一个元组)和三个目标a
、b, c
和d
组成,它们在下面分配订单:
a = 1, 2
b, c = 1, 2
d = 1, 2
不涉及铸造。 a
和 d
的赋值直接赋给元组; b
和 c
的赋值将每个目标与元组中的相应值配对。
也许最值得注意的是,它是 而不是 ,就像在 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. a
和 d
只是分配元组 (1, 2)
。
我正在学习 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
(计算结果为一个元组)和三个目标a
、b, c
和d
组成,它们在下面分配订单:
a = 1, 2
b, c = 1, 2
d = 1, 2
不涉及铸造。 a
和 d
的赋值直接赋给元组; b
和 c
的赋值将每个目标与元组中的相应值配对。
也许最值得注意的是,它是 而不是 ,就像在 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. a
和 d
只是分配元组 (1, 2)
。