簡體   English   中英

TypeError:“元組”對象不支持項目分配

[英]TypeError: 'tuple' object does not support item assignment

我正在嘗試編寫一個簡短的程序,允許用戶將數字列表輸入到input()函數中,然后使用add_25函數將25添加到列表中的每個項目。

程序運行時出現以下錯誤: TypeError: 'tuple' object does not support item assignment

我嘗試使用逗號對數字進行除法。 這是程序:

testlist = [2,6,2]

def add_25(mylist):

    for i in range(0, len(mylist)):
        mylist[i] = mylist[i] + 25

    return mylist

print add_25(testlist)

actual_list = input("Please input a series of numbers, divided by a comma:")

print add_25(actual_list)

在Python 2中, input()將評估字符串,在這種情況下,它將創建一個元組,並且由於元組是不可變的,因此您將得到該錯誤。

>>> eval('1, 2, 3')
(1, 2, 3)

在此處 raw_inputlist-comprehension 一起使用會更安全

inp = raw_input("Please input a series of numbers, divided by a comma:")
actual_list = [int(x) for x in inp.split(',')]

或者,如果您不擔心用戶的輸入,則只需將元組傳遞給list()即可將其轉換為list()


還要注意,當您嘗試在函數內部就地更新列表時,除非您想將另一個變量分配給同一列表對象,否則返回列表是沒有意義的。 返回新列表或不返回任何內容。

函數input讀取一個字符串並將其評估為Python表達式 因此,以逗號分隔的列表成為值的元組,這些值傳遞給add_25() ,並且此函數嘗試將某些內容分配給mylist[i]

元組是不可變的,它們不支持項目分配(故意)。

您可以使用actual_list = list(input(...))將元組轉換為list (支持項目分配)。

但是每次有人使用input() ,都必須警告他: input()有安全隱患。 評估 用戶的輸入,因此可以執行 用戶鍵入的任意操作。 這意味着您的程序將在您的許可下執行用戶要求的操作。 通常這不是一個好的設計。

如果您始終是唯一的用戶,或者如果您完全信任程序的所有用戶,那么就這樣吧。

除了其他答案涵蓋的所有input()方面,我還要添加此完全不同的方面:

您的函數add_25()可能不應該更改其輸入。 您的執行或嘗試執行失敗,因為元組不允許這樣做。

但是實際上您不必更改輸入(並且您不應該更改輸入,因為由於其丑陋的副作用,這不是很好的樣式)。 相反,您可以只返回一個新的元組:

def add_25(mytuple):
    return tuple(x + 25 for x in mytuple)

這樣,什么都不分配給元組,僅創建並返回一個新的元組。

def test_tuples_of_one_look_peculiar(self):
    self.assertEqual( __,(1).__class__)
    self.assertEqual(__, (1,).__class__)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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