![](/img/trans.png)
[英]TypeError: 'tuple' object does not support item assignment On non tuple object
[英]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_input
與list-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.