2017-10-28 118 views
-1

我想知道變量分配和這是爲什麼允許:爲什麼a,b = 1不允許?

a = 1, 2 

a = b = 1 

,但這是不允許的:

a, b = 1 

什麼是背後的邏輯? 謝謝

+3

結果會是什麼? –

+2

'a,b ='在某些情況下有效。例如'a,b = x'很好,如果'x'是一個長度爲2的迭代。在你的版本中沒有明確的意思。 – Holloway

+0

因爲'a,b = 1'意味着完全不同的東西?這在所有編程語言中都是通用的,使用不同的語法來完成不同的事情。 –

回答

3

我假設你可能熟悉C/C++這種靜態類型的語言。這意味着初始化一個變量時必須聲明一個變量的類型(例如,你會說int a;)。

在C/C++中,當你做int a, b = 1;(例如)時,你試圖做的語法是有效的語法,因爲我們將兩個變量a和b初始化爲整數,其中第二個變量是賦值爲1.

但是,Python是一種動態類型化語言 - 變量的類型不需要聲明。因此,當我們做a, b = 1時,我們實際上使用了一個叫做「解包」的Python特性。 Python正試圖解壓縮1變量ab - 但這是不可能的,因爲1只是一個單一的數據 - 它不是一個列表或元組或什麼。

因爲Python是動態類型的,所以我們不能只是啓動一個變量而不給它任何值(就像我們在做C時做的int a;)。當你做a, b = 1時,它試圖遍歷1並將其內容分配給變量ab。因此,錯誤TypeError: 'int' object is not iterable

+0

對我來說,它看起來更像*數學*而不是C。在數學中,我會說「a,b = 1」並不罕見,並且意味着a和b都是1.而且Python非常麻煩,例如也支持「1

1

左右側不對稱。在

a = 1, 2 

Python做包裝的右側參數。兩個逗號分隔的參數創建元組,所以這相當於a = (1, 2)

隨着

a, b = 1 

蟒蛇試圖做拆包。它將右手錶達式的第一個值分配給a,然後嘗試將第二個值分配給b。由於沒有第二個值,這將失敗。它會將值1視爲可迭代,因此會給出TypeError: int is not iterable

你應該寫點像a, b = 1, 2

+1

可能還包括你得到一個'TypeError:'int'對象不是可迭代的',並且該錯誤是由於python試圖解壓'1'而導致的,並且沒有這樣做。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ:你說得對,我編輯了答案。 –

+0

我已經提出了兩個答案,因爲他們都很好地解釋了觀察到的行爲,雖然不同。 –

0

在第一種情況下,蟒蛇假定爲1元組和2

>>> a = 1, 2 
>>> a 
(1, 2) 

a, b = 1你想給值a和b,所以必須對他們是兩個值,但你只提供一個即1。如果你有一個長度爲2的迭代,那麼它將工作。

>>> a, b = [6, 7] 
>>> a 
6 
>>> b 
7 
0

在蟒蛇當你給兩個數/串,python解釋認爲它是一個元組

a = 1, 2 

在上述行正在創建的元組對象稱爲

a, b = 1 

在上面一行左邊的語法是針對一個元組的,所以它的右邊是元組值 所以

a,b = 1,1 

作品

相關問題