【问题标题】:TypeError: 'tuple' object does not support item assignmentTypeError:“元组”对象不支持项目分配
【发布时间】:2015-02-05 13:47:43
【问题描述】:

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


    【解决方案1】:

    在 Python 2 中,input() 将对字符串进行求值,在这种情况下,它将创建一个元组,并且由于元组是不可变的,您会收到该错误。

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

    It is safer to useraw_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()


    还请注意,当您尝试在函数内部就地更新列表时,返回列表是没有意义的,除非您想将另一个变量分配给同一个列表对象。要么返回一个新列表,要么什么都不返回。

    【讨论】:

    【解决方案2】:

    函数input 读取字符串并将其作为 Python 表达式计算。因此,逗号分隔的列表变成了一个值的元组,这些值被传递给add_25(),并且该函数尝试分配给mylist[i] 一些东西。

    而且元组是不可变的,它们不支持项目分配(故意)。

    您可以使用actual_list = list(input(...)) 将元组转换为list(支持项目分配)。

    但是每次有人使用input(),就必须警告他:input() 是一种安全风险。它评估 用户 的输入,因此可能执行 用户 键入的任意内容。这意味着您的程序将在您的权限下执行用户要求它执行的操作。这通常不是一个好的设计。

    如果您始终是唯一的用户,或者如果您完全信任程序的所有用户,那就这样吧。

    【讨论】:

    • 请注意,由于ast.literal_evaleval 的安全版本,因此应该真正使用:ast.literal_eval(raw_input(...)),而几乎从不使用input(...)
    • 是的,但在这种情况下,程序员打算解析列表或逗号分隔的值,而不是文字。但是感谢指向该函数的指针;还不知道那个。
    • 正如ast.literal_eval("1, 2, 3") 导致(1, 2, 3) 就像eval 一样,在这种情况下它实际上是替换的下降。
    • 哦,我明白了。在这个意义上,元组算作文字。这真是一件好事,谢谢。
    【解决方案3】:

    除了其他答案中涵盖的所有input() 方面,我想添加这个完全不同的方面:

    您的函数add_25() 可能不应该更改它的输入。你的做,或者尝试做,但失败了,因为元组不允许这样做。

    但您实际上不必更改输入(而且您不应该更改,因为这不是好的样式,因为它有丑陋的副作用)。相反,您可以只返回一个新元组:

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

    这样,不会为元组分配任何内容,只是创建并返回一个新元组。

    【讨论】:

      【解决方案4】:
      def test_tuples_of_one_look_peculiar(self):
          self.assertEqual( __,(1).__class__)
          self.assertEqual(__, (1,).__class__)
      

      【讨论】:

      猜你喜欢
      • 2019-05-28
      • 2016-07-31
      • 2014-02-18
      • 2017-03-26
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多