2017-10-11 33 views
0
>>> x = [1,3] 
>>> x 
[1, 3] 
>>> x[0] 
1 
>>> x[1] 
3 
>>> x,y = [1,3] 
>>> x 
1 
>>> y 
3 
>>> x[0] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'int' object is not subscriptable 

據我所知,列表本身就是一個值。因此,它可以分配給一個變量。在Python中解壓列表的概念 - 衝突的語法規則

這在上面的代碼中很明顯,其中x = [1,3],x返回列表值[1,3]。但是,如果賦值運算符左側有兩個變量,則情況會改變。 列表到變量的右側不再是值,但是,相反,該列表的元素是值。

有人會友好地解釋爲什麼這樣。提前致謝。

也許我誤解了「解包」是什麼。賦值運算符左側有多個變量時,規則是否會更改?

+0

'x,y = [1,3]'是一個拆包,'x = [1,3]'不是。你可以使用類似'[x] = [1]'的方式將長度爲1的列表解開爲單個目標,但是自己分配給'x'不會觸發解包。 – user2357112

+0

是的,當賦值運算符左側有多個變量時,規則會改變。這會觸發賦值運算符右側的對象的「解包」,以及對左側相關變量的相應賦值。這是爲什麼?因爲有人(可能是Guido)認爲這是Python的一個很好的功能。 –

+0

好的,所以我不理解「賦值給變量」和「解包」之間的區別。因爲有一個賦值運算符,我的假設是右邊的值被分配給左邊的變量。在這種情況下,列表被分配給左側的單個變量,這對我來說很有意義。但是,當左側有多個變量時,它不會分配值 - 列表 - 而是列表中的元素。這對我來說沒有意義,因爲值是列表本身,而不是列表中的元素。 – efw

回答

-1

這是一個簡單的任務:

x = [1, 3] 

這是拆包:

x, y = [1, 3] 

也許這是你想要什麼:

x = y = [1, 3] 
x[0] # 1 

說明

觀察到x, y實際上是方便(x, y):這就是爲什麼有左多個值

(x, y) = [1, 3] 

x = 1, 3 
x # (1, 3) 

表現不同。

+0

,謝謝。我只是想了解這個概念,並通過索引列表值來測試它。 – efw

+0

不客氣!我補充說明了爲什麼左邊的多個值的行爲有所不同。 – aaron

+0

'x,y'是** not **對於'(x,y)'是一個「方便」 - 它是用逗號表示一個元組,而不是括號(儘管有時需要這些來消除模糊性),請參閱:[wiki.python.org/moin /TupleSyntax](https://wiki.python.org/moin/TupleSyntax) –