[英]Python tuple … is not a tuple? What does the comma do?
我在課程材料中查看代碼,並且必須編寫一個函數,將值99添加到list
或tuple
。 最終代碼如下所示:
def f(l):
print(l)
l += 99,
print(l)
f([1,2,3])
f((1,2,3))
這被用來表示不同的東西,但我有點掛在線l += 99,
. 這樣做,是創建一個包含99和list
的迭代,以及tuple
支持這樣一個對象的簡單“添加”來創建一個新實例/添加一個新元素。
我真正得到的是使用語法element,
創建的是什么? 如果我執行x = 99,
之type(x)
的賦值x = 99,
則type(x)
將是tuple
但如果我嘗試運行x = tuple(99)
,它將失敗,因為99不可迭代。 所以有:
element,
創建的某種中間可迭代對象element,
? tuple
沒有迭代,不知何故,
被映射到了嗎? 編輯:如果有人想知道為什么接受的答案是那個:我的第二個問題的解釋成功了。 我應該對我的問題更清楚,但是+=
實際上讓我感到困惑,這個答案包含了相關的信息。
如果=
的左側參數是一個簡單名稱,則當前綁定到該名稱的參數類型是無關緊要的。 tuple(99)
失敗,因為tuple
的參數不可迭代; 它與x
是否已經引用tuple
的實例無關。
99,
創建一個帶有單個參數的元組; 只需將括號與逗號的其他用法分開即可使用括號。 例如, foo((99,100))
使用單個元組參數調用foo
,而foo(99,100)
使用兩個不同的int
參數調用foo
。
元組構造函數需要一個可迭代的(就像你在錯誤消息中所說的那樣),所以為了做x = tuple(99)
,你需要將它包含在像列表一樣的迭代中:
x = tuple([99])
要么
x = tuple((99,))
語法element,
只是創建一個“中間” tuple
,而不是其他類型的對象(盡管tuple
當然是可迭代的)。
但是,有時您需要使用括號以避免歧義。 出於這個原因,你經常會看到這個:
l += (99,)
......即使括號在語法上不是必需的。 我也碰巧認為這更容易閱讀。 但是在你已經發現的其他情況下,括號在句法上是必要的:
list((99,))
tuple((99,))
set((99,))
您也可以這樣做,因為[]
list
了一個list
:
list([99])
tuple([99])
set([99])
...但是你不能這樣做,因為99,
在這些情況下不是一個tuple
對象:
list(99,)
tuple(99,)
set(99,)
要回答你的第二個問題,不,沒有辦法讓tuple()
函數接收一個不可迭代的。 實際上這是element,
或(element,)
語法的目的 - 非常類似於[]
用於list
和{}
用於dict
和set
(因為list
, dict
和set
函數都需要可迭代的參數):
[99] #list
(99,) #tuple - note the comma is required
{99} #set
正如問題評論中所討論的那樣,令人驚訝的是你可以使用tuple
對象增加(+ =)一個list
。 請注意,您不能這樣做:
l = [1]
l + (2,) # error
這是不一致的,所以它可能是不允許的 。 相反,您需要執行以下操作之一:
l += [2]
l += list((2,))
然而,修復它會給人們帶來麻煩(更不用說去除邪惡的計算機科學教授混淆的成熟機會),所以他們沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.