今天我在做一些python list操作的時候注意到了一個奇怪的行爲。list + = str和list + = str有什麼區別,
比方說,
a = []
b = 'xy'
當我做,一個+ = b中的解釋器返回:
a += b
a == ['x', 'y']
但是當我做,一個+ = B,(用逗號)解釋返回a = ['xy']
a += b,
a == ['xy']
有人可以請解釋這裏發生了什麼。
今天我在做一些python list操作的時候注意到了一個奇怪的行爲。list + = str和list + = str有什麼區別,
比方說,
a = []
b = 'xy'
當我做,一個+ = b中的解釋器返回:
a += b
a == ['x', 'y']
但是當我做,一個+ = B,(用逗號)解釋返回a = ['xy']
a += b,
a == ['xy']
有人可以請解釋這裏發生了什麼。
a += b
當a
是一個列表,這個操作類似於a.extend(b)
。所以它迭代對象b
,將每個元素附加到a
。
如果迭代字符串'xy'
,則會生成兩個元素'x'
和'y'
。
如果迭代元組'xy',
,它會產生一個元素'xy'
。
逗號創建tuple
- 所以a += b,
的含義一樣a += (b,)
a += ('xy',)
你有一個元素,因此幾乎就像
a += ['xy']
所以你必須
a = [] + ['xy']
加元組,其給出結果
a = ['xy']
線
a += b,
相當於
a += (b,)
它創建一個元組與一個項目。如果添加,則將其項目'xy'
添加到a
。
如果添加一個字符串,如'xy'
,它將自行計算爲一個字符序列,並且每個序列項目(字符)將單獨添加到a
。
所以基本上逗號將b
包裝成一個元組。
@wim - 您是否在意解釋這不是鏈接問題的重複? – TigerhawkT3
@ TigerhawkT3當然,這是因爲'a + = b'不是'list.extend(a,b)'(雖然* result *是相似的)。它實際上更像'a = a .__ iadd __(b)'。 – wim
@wim - 我想說它更像是'list.extend',因爲'list .__ iadd__'修改了列表並且還返回了它,而'list。extend'只修改列表但不返回,像'a + = b'這樣的賦值不像其他語言那樣返回賦值。 – TigerhawkT3