类型错误:无法将“list”对象解释为整数。

50

playSound 函数接受一个整数列表,并会为每个不同的数字播放声音。因此,如果列表中有数字 1,它将播放特定的声音。

def userNum(iterations):
  myList = []
  for i in range(iterations):
    a = int(input("Enter a number for sound: "))
    myList.append(a)
    return myList
  print(myList)

def playSound(myList):
  for i in range(myList):
    if i == 1:
      winsound.PlaySound("SystemExit", winsound.SND_ALIAS)

我遇到了这个错误:

TypeError: 'list' object cannot be interpreted as an integer

我已经尝试了几种将列表转换为整数的方法。我不太确定需要改变什么。我确信有一种更有效的方法来实现这个目标。任何帮助都将不胜感激。


3
range(myList)基本上是一个整数。 所以例如,如果myList包含7个项目,则表示{i in 7},这在这里没有意义。 相反,只需使用{for i in mylist}遍历myList。 - Geo Mukkath
13个回答

58

错误信息通常就是精确地表达它们所要传达的意思。因此必须非常仔细地阅读。当您这样做时,您会发现这个错误实际上并没有抱怨您的列表包含什么类型的对象,正如您所认为的那样,而是关于它什么类型的对象。它不是说它想要您的列表包含整数(复数) - 相反,它似乎想要您的列表是一个整数(单数)而不是任何东西的列表。由于你无法将一个列表转换成一个单一的整数(至少在这个上下文中没有有意义的方法),所以不应该尝试。

那么问题是:为什么译码器似乎想要将您的列表解释为整数?答案是您将列表作为输入参数传递给range,而range期望一个整数。不要这样做。改为使用for i in myList


14
或者,如果想要遍历索引而不是元素本身,则使用for i in range(len(myList)) - 3yakuya
10
为了让代码更易读,我建议使用for index, item in enumerate(myList)代替原本的写法。请注意,这并不改变原有逻辑,只是增加了可读性。 - jez
1
如果使用以下代码:for index, (item1, item2) in enumerate(list1, list2),将会出现相同的错误。为了纠正这个问题,请使用zip()函数:for index, (item1, item2) in enumerate(zip(list1, list2)) - Javier TG
1
@JavierTG 没错。在这种情况下,enumerate()希望将您提供的第二个参数解释为“第一个项目的整数索引标签”,因此,再次使用列表将无法在该位置工作。 - jez

21

我遇到这个错误是因为需要在括号中引用数组。在这种情况下,这个错误有点棘手...

例如:concatenate((a, b)) 是正确的方式。

而不是 concatenate(a, b)

希望这能帮到你。


是的!np.concatenate对于数组需要双括号: numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind") - undefined

12

错误来自于这里:

def playSound(myList):
  for i in range(myList): # <= myList is a list, not an integer

您不能将一个列表传递给 range,因为它期望一个整数。最有可能的是,您想要执行以下操作:

 def playSound(myList):
  for list_item in myList:
OR
 def playSound(myList):
  for i in range(len(myList)):
OR
 def playSound(myList):
  for i, list_item in enumerate(myList):

9

range函数需要一个整数参数,它将以此为基础构建一个整数范围:

>>> range(10)
range(0, 10)
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>

此外,如果给它一个列表,会引发 TypeError 错误,因为 range 不知道如何处理它:
>>> range([1, 2, 3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object cannot be interpreted as an integer
>>>

如果您想访问myList中的项目,请直接循环遍历该列表:
for i in myList:
    ...

演示:

>>> myList = [1, 2, 3]
>>> for i in myList:
...     print(i)
...
1
2
3
>>>

6

删除 range

for i in myList

range接受一个整数,表示你想要在列表中为每个元素创建的数量。


5
你应该这样做:
for i in myList:
    # etc.

也就是说,去掉range()部分。 range()函数用于生成数字序列,它接收要生成范围的限制作为参数,不能将一个列表作为参数传递。 对于遍历列表,只需按照上述示例编写循环即可。

5

由于它是一个列表,因此不能直接将其作为区间函数的单个整数值使用,因为该列表的单个整数值丢失。

使用以下方式

for i in range(len(myList)):

这样,我们可以得到可以轻松使用的单个整数值。


2
playSound()中,不要使用
for i in range(myList):

尝试
for i in myList:

这将遍历myList的内容,我相信这正是你想要的。range(myList)没有任何意义。

2
def userNum(iterations):
    myList = []
    for i in range(iterations):
        a = int(input("Enter a number for sound: "))
        myList.append(a)
    print(myList) # print before return
    return myList # return outside of loop

def playSound(myList):
    for i in range(len(myList)): # range takes int not list
        if i == 1:
            winsound.PlaySound("SystemExit", winsound.SND_ALIAS)

1
n=input().split()
ar=[]
for i in n:
    if i not in ar:
        ar.append(i)
print(*ar)

我们通常将字符串作为整数传递... 为此,我们必须键入 "n"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接