【问题标题】:TypeError: 'int' object does not support item assignmentTypeError:“int”对象不支持项目分配
【发布时间】:2014-02-18 20:48:49
【问题描述】:
p=range(0,1200,10)
lenp=len(p)
rp=1.331
po=1000
T=280
Temp=(lenp)

for i in p:
    Temp[i]=T*(p[i]/po)**rp
print T

我遇到了这个错误,不知道如何修复它......

Temp[i]=T*(p[i]/po)**rp

TypeError: 'int' object does not support item assignment

【问题讨论】:

    标签: python typeerror


    【解决方案1】:

    您的 Temp 不是元组,它只是括号中的整数。你可以用一个简单的, 来解决这个问题。考虑以下几点:

    >>> x = (42)  # not a tuple
    >>> x[0]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'int' object has no attribute '__getitem__'
    >>> 
    >>> x = (42,)  # tuple
    >>> x[0]
    42
    

    但是,元组是不可变的,你不能执行这样的赋值:

    >>> x[0] = 0
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    

    您可以改用列表来解决此问题。

    【讨论】:

    • 但是 OP 正试图 assign 给索引;元组不允许这样做。
    • 通过添加逗号,OP 可以 indexx,但仍然无法修改它,原因有两个:(1) 元组是不可变的。 (2) i 循环遍历不是真正元组或数组索引的值。
    • @MartijnPieters 是的,这是一个很好的观点。我会编辑答案。
    【解决方案2】:

    您可能正在尝试在此处构建长度为lenp 的列表。您需要在这里通过乘法创建一个列表:

    Temp = [None] * lenp
    

    但你最好通过附加来构建列表:

    Temp = []
    for i in p:
        Temp.append(T * (i / po) ** rp)
    

    你不使用p[i],而是使用i直接; Python for 循环真的是 for each 循环。

    您的range() 生成[0, 10, 20, ... 1200) 系列中的值,for 循环在每次迭代时将这些值中的每一个分配给i。如果你再次使用i 来索引p,你会遇到问题; p[0] 仍然是 0,但 p[10] 将是 100p[20]200,等等,直到 p[120] 抛出 IndexError,因为在该范围内只有 119 个不同的值.

    您可以将附加到Tempfor 循环折叠到列表推导中,以一次性构建列表:

    rp=1.331
    po=1000
    T=280
    
    Temp = [T * (i / po) ** rp for i in range(0, 1200, 10)]
    

    【讨论】:

      【解决方案3】:

      您的代码中有几个问题。

      最直接的一个是您的Temp 值不是您可以分配事物的序列,只是一个整数(括号不做任何事情)。虽然您可以通过添加逗号将其变为元组,但这仍然不允许您在创建 Temp 后将值分配给它(元组是不可变的)。相反,您可能想要一个列表。

      但是,您的循环还有另一个问题。像for value in sequence 这样的for 循环将sequence 中的值分配给变量value。它不分配索引!如果您需要索引,可以使用 enumerate 或使用不同的循环构造,例如列表推导式。

      这是您的代码的最小更改版本,它首先创建一个 lenp 零列表,然后用计算的值替换它们的值:

      p=range(0,1200,10)
      lenp=len(p)
      rp=1.331
      po=1000
      T=280
      Temp=[0]*lenp
      
      for i, p_value in enumerate(p):
          Temp[i]=T*(p_value/po)**rp
      print T
      

      这是一个更 Python 的版本,它使用列表推导而不是普通循环:

      rp=1.331
      po=1000
      T=280
      Temp = [T*(p_value/po)**rp for p_value in range(0,1200,10)]
      

      【讨论】:

        【解决方案4】:

        错误在于,当我们为 x 分配一个(数字)时,这就是实际发生的情况,

        >>> x = (50)
        >>> x
        50
        

        所以如果你想创建一个空列表,你可以这样做

        rows = 5
        cols = 3
        matrix = [[0 for c in range(cols)] for r in range(rows)]
        

        它会创造出这样的东西,

        >>> matrix
        [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-09
          • 2016-07-31
          • 2017-03-26
          • 2021-08-05
          • 1970-01-01
          相关资源
          最近更新 更多