2017-10-17 69 views
0

解開我知道這是不是在一個行中指定多個值的方式,但我只是想了解一下4號線在這裏做什麼:沒有足夠的值,以在鏈分配

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分別爲intfloat類型,則會顯示"int/float object is not iterable"錯誤。

如果abc是字符串,說a="ab"b="cd"c="ef",則打印顯示:

ef f f 

如果字符串的長度!= 2的,它顯示了一個"not enough/too many values to unpack"錯誤。

有人可以解釋發生了什麼?

回答

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 

這就是爲什麼如果你打印e值爲ab你會看到他們也會等於'e'

這也是爲什麼,如果cab在這裏沒有發揮作用)是一個長度爲> 2的字符串,解包將失敗。

+0

這是不正確的,'了'和'B'沒有作用那裏。如果你試用'A = 4,B =「aa」,你將得到'SyntaxError:不能賦值給文字',如果你試圖獲得'A'的值,你將得到'NameError:name'A'沒有定義' – nutmeg64

+0

@ nutmeg64我們再來看看這個。會發生什麼是'A ='aa''嘗試,然後嘗試執行'4,B ='aa''。整件事失敗了,因爲由於這是在一個步驟中完成的,所以'SyntaxError'阻止了整個賦值,'A'沒有賦值並且得到'NameError'。嘗試'a = 1; b = 3; A = a,b ='ef''並查看輸出。 –

+0

這是正確的。因此,下面的代碼片段「實際上評估爲:」不正確。你暗示在那裏,賦值「A = c」發生在任何其他賦值之前。 – nutmeg64

1

澄清: 我的回答沒有解釋「Python解釋器如何工作」。在我的回答中描述的一系列事件僅僅是簡化情況,以幫助初學者程序員更好地理解它。

這裏發生的事情是這樣的:

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

這就是解釋如何看待它。

這是一個多重賦值語句。

解釋器試圖將c解包爲兩個參數的迭代。 然後嘗試將第一個參數分配給b,並將第二個參數分配給C

在接下來的步驟有一個簡單的 元組到元組,其中 (b, C)解包並指定爲 a = bB = C 雙參數分配。

最後一步,該 元組 迭代包含兩個參數需要解壓縮並分配給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') 
+0

嗯,沒有。這不是什麼情況,我在我的答案中加入了反彙編,它顯示瞭解釋器實際上在做什麼。如果你的要求是正確的,如果''''ef''和'* *'''''''''''''''''A'''等於'('e','f')'。 –

+0

@JimFasarakisHilliard編輯。不要掛在小東西上;) – nutmeg64

+0

同樣,這是不正確的。在多項任務中採取了一系列非常明確的步驟,並且您對此進行了誤傳。 –