没有足够的值来解压缩链接赋值

时间:2017-10-17 06:31:49

标签: python python-3.x iteration iterable-unpacking

我知道这不是在一行中分配多个值的方法,但我只是想了解第四行在这里做了什么:

a = input("blah blah")
b = input("blah blah blah")
c = input("blaaah")
A=a,B=b,C=c
print(A,B,C)

如果abcintfloat类型,则会显示"int/float object is not iterable"错误。

如果abc是字符串并说a="ab"b="cd"c="ef",则会显示以下内容:

ef f f

如果字符串的长度为!= 2,则会显示"not enough/too many values to unpack"错误。

有人可以解释发生了什么吗?

2 个答案:

答案 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

这就是为什么如果您打印ab的值,您会发现它们也等于'e'

这也是为什么,如果cab在此处不起作用)是一个长度为> 2的字符串,则解包将失败。

答案 1 :(得分:1)

<强>澄清: 我的回答没有解释“Python解释器如何工作”。在我的回答中描述的一系列事件仅仅是简化情况,以帮助初学者更好地理解它。

这里发生的是:

A = (a, B) = (b, C) = c

这就是口译员的看法。

这是一个多重赋值语句。

解释器尝试将c解包为两个参数的可迭代。 然后尝试将第一个参数分配给b,将第二个参数分配给C

在下一步中,有一个简单的元组到元组两个参数赋值,其中(b, C)被解压缩并分配为a = bB = 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')