簡體   English   中英

Python元組...不是一個元組? 逗號有什么作用?

[英]Python tuple … is not a tuple? What does the comma do?

我在課程材料中查看代碼,並且必須編寫一個函數,將值99添加到listtuple 最終代碼如下所示:

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{}用於dictset (因為listdictset函數都需要可迭代的參數):

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM