我知道这不是在一行中分配多个值的方法,但我只是想了解第四行在这里做了什么:
a = input("blah blah")
b = input("blah blah blah")
c = input("blaaah")
A=a,B=b,C=c
print(A,B,C)
如果a
,b
,c
为int
或float
类型,则会显示"int/float object is not iterable"
错误。
如果a
,b
,c
是字符串并说a="ab"
,b="cd"
,c="ef"
,则会显示以下内容:
ef f f
如果字符串的长度为!= 2
,则会显示"not enough/too many values to unpack"
错误。
有人可以解释发生了什么吗?
答案 0 :(得分:1)
你可以看一下反汇编,看看究竟发生了什么:
from dis import dis
dis('A=a,B=b,C=c')
1 0 LOAD_NAME 0 (c)
2 DUP_TOP
4 STORE_NAME 1 (A)
6 DUP_TOP
8 UNPACK_SEQUENCE 2
10 STORE_NAME 2 (a)
12 STORE_NAME 3 (B)
14 UNPACK_SEQUENCE 2
16 STORE_NAME 4 (b)
18 STORE_NAME 5 (C)
20 LOAD_CONST 0 (None)
22 RETURN_VALUE
这就是链式分配:
A=a,B=b,C=c
实际评估为:
A = c
a, B = c
b, C = c
这就是为什么如果您打印a
和b
的值,您会发现它们也等于'e'
。
这也是为什么,如果c
(a
和b
在此处不起作用)是一个长度为> 2
的字符串,则解包将失败。
答案 1 :(得分:1)
<强>澄清:强> 我的回答没有解释“Python解释器如何工作”。在我的回答中描述的一系列事件仅仅是简化情况,以帮助初学者更好地理解它。
这里发生的是:
A = (a, B) = (b, C) = c
这就是口译员的看法。
这是一个多重赋值语句。
解释器尝试将c
解包为两个参数的可迭代。
然后尝试将第一个参数分配给b
,将第二个参数分配给C
。
在下一步中,有一个简单的元组到元组两个参数赋值,其中(b, C)
被解压缩并分配为a = b
和B = C
。
在最后一步中,包含两个参数的元组 iterable需要解压缩并分配给A
。因为A
在这里是一个新变量,所以元组不会解包并只将元组迭代赋值给A
。
例如:
>>> c = (1, 'one')
>>> A = a, B = b, C = c
>>> A
(1, 'one')
>>> B
'one'
>>> C
'one'
>>> a
1
>>> b
1
>>> c
(1, 'one')