【问题标题】:Where is it treated as an int?它在哪里被视为int?
【发布时间】:2019-08-24 20:24:44
【问题描述】:

我已经看到了类似问题的答案,但我在代码中找不到将 x 视为 int 的位置。

import matplotlib.pyplot as plt
import numpy as np

def aitken(x,y,value,n):
    if n == 1:
        return y[0]
    first_array = x.pop(n-1)
    second_array = x.pop(n-2)
    first_y = y.pop(n-1)
    second_y = y.pop(n-2)
    n1 = n-1
    return (aitken(first_array,first_y,value,n1)*(value - x[n-1]) - aitken(second_array, second_y,value,n1)*(value - x[n-2]))/(x[n-1] - x[n-2])

x = [1, 4, 7, 11, 15, 20, 30, 50, 77, 92, 100]
y = [5, 20, 52, 121, 228, 403, 903, 2504, 5929, 8464, 10005]
n = len(x)
x_fit = np.arange(0,104,1)
y_fit = aitken(x,y,x_fit,n)

以下是错误消息:

  File "exl.py", line 17, in <module>
    y_fit = aitken(x,y,x_fit,n)
  File "exl.py", line 13, in aitken
    return (aitken(first_array,first_y,value,n1)*(value - x[n-1]) - aitken(second_array, second_y,value,n1)*(value - x[n
-2]))/(x[n-1] - x[n-2])
  File "exl.py", line 8, in aitken
    first_array = x.pop(n-1)
AttributeError: 'int' object has no attribute 'pop'

对不起,如果这个问题太基本了。我是 python 新手。

【问题讨论】:

  • first_array 是从x 中提取的一个,但随后被传递给递归调用as x,这大概是错了。
  • 欢迎来到 Stack Overflow!以后请发minimal reproducible example
  • 哦,所以它是一个值?那么如何从 x 构造两个数组呢?
  • 您希望first_array 成为一个列表吗?应该唱什么?
  • 没关系,明白了。非常感谢

标签: python python-3.x numpy


【解决方案1】:

您的变量 first_array 是一个 int,因为它是您的列表 x 的一个元素(它们都是 int)。如果您不使用与主脚本中的变量相同的名称作为函数参数,您会发现更容易调试。

【讨论】:

    【解决方案2】:

    一旦函数到达返回值,你就传递给它 first_array,你认为它是一个列表。

    first_array 是一个整数,因为 pop 函数返回:

    列表中的最后一个值或给定的索引值。

    【讨论】:

      【解决方案3】:

      您遇到的问题是,当您递归调用它时,您不再将数组传递给您的函数。

          first_array = x.pop(n-1)
          second_array = x.pop(n-2)
      

      这不是给你一个数组,而是位置 (n-1) 的值。例如:

      x = [1, 4, 7, 11, 15, 20, 30, 50, 77, 92, 100]
      first_array = x.pop(n-1)
      # first_array = 100
      # x = [1, 4, 7, 11, 15, 20, 30, 50, 77, 92]
      

      因此,当您传入 first_array 并尝试弹出 x 时,它不再是数组并且会引发错误。相反,您将想要修改您的返回,而不是传递一个标量,而是传递一个数组。我希望这会有所帮助,祝你好运。

      【讨论】:

        【解决方案4】:

        如果您使用带有列表的 pop 方法,您可以执行预期的操作:

        x=[1,2,3]
        f_array=x.pop(0)
        print(f_array)
        

        输出:

        1
        

        所以它不是一个列表,所以你得到一个错误, 因为你不能在这个变量上重新应用 pop,在这种情况下它是一个整数,因为删除的列表项是一个整数

        【讨论】:

          猜你喜欢
          • 2017-09-17
          • 2019-06-18
          • 2019-03-22
          • 1970-01-01
          • 2013-03-14
          • 2011-07-23
          • 1970-01-01
          • 1970-01-01
          • 2017-04-26
          相关资源
          最近更新 更多