TypeError:'tuple'对象不支持项目分配

时间:2014-12-07 23:06:20

标签: python typeerror python-2.x

我正在尝试编写一个简短的程序,允许用户将一个数字列表输入到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)

4 个答案:

答案 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__)