我正在尝试编写一个简短的程序,允许用户将一个数字列表输入到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)
答案 0 :(得分:3)
在Python 2中input()
将评估字符串,在这种情况下它将创建一个元组,并且由于元组是不可变的,你将得到该错误。
>>> eval('1, 2, 3')
(1, 2, 3)
It is safer to use 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()
即可将其转换为列表。
另请注意,当您尝试在函数内部就地更新列表时,除非您想要将另一个变量分配给同一个列表对象,否则返回列表是没有意义的。要么返回新列表,要么不返回任何内容。
答案 1 :(得分:0)
函数input
读取字符串并将其评估为Python表达式。因此,以逗号分隔的列表将成为值的元组,这些值将传递给add_25()
,并且此函数会尝试分配给mylist[i]
某些内容。
元组是不可变的,它们不支持项目分配(故意)。
您可以使用actual_list = list(input(...))
将元组转换为list
(支持项目分配)。
但每次有人使用input()
时,都必须警告他:input()
存在安全风险。它评估用户的输入,因此执行 用户键入的任意内容。这意味着您的程序将根据您的权限执行用户要求的操作。这通常不是一个好的设计。
如果您始终是唯一的用户,或者您完全信任所有程序用户,那就这样吧。
答案 2 :(得分:0)
除了其他答案中涵盖的所有input()
方面,我还想添加完全不同的方面:
您的函数add_25()
可能不应更改其输入。你的确,或试图,失败,因为元组不允许这样做。
但实际上你不必改变输入(你不应该这样做,因为它的副作用很难看,这不是好的风格)。相反,你可以只返回一个新的元组:
def add_25(mytuple):
return tuple(x + 25 for x in mytuple)
这样,没有任何内容分配给元组,只创建并返回一个新的元组。
答案 3 :(得分:-1)
def test_tuples_of_one_look_peculiar(self):
self.assertEqual( __,(1).__class__)
self.assertEqual(__, (1,).__class__)