TypeError: объект "list" не может быть интерпретирован как целое число

Функция playSound принимает список целых чисел и будет воспроизводить звук для каждого другого номера. Поэтому, если одно из чисел в списке 1, 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

Я попробовал несколько способов конвертировать список в целые числа. Я не слишком уверен, что мне нужно изменить. Я уверен, что есть более эффективный способ сделать это. Любая помощь будет очень признательна.

Ответ 1

Сообщения об ошибках обычно означают точно то, что они говорят. Поэтому их нужно внимательно прочитать. Когда вы это сделаете, вы увидите, что этот на самом деле не жалуется, как вы, кажется, предполагали, о том, какой объект в вашем списке содержит, а скорее о том, какой объект он является. Он не говорит, что хочет, чтобы ваш список содержал целые числа (множественное число) - вместо этого, кажется, что ваш список должен быть целым (единственным), а не списком чего-либо. И поскольку вы не можете преобразовать список в одно целое (по крайней мере, не таким образом, что имеет смысл в этом контексте), вы не должны пытаться.

Итак, возникает вопрос: почему интерпретатор, похоже, хочет интерпретировать ваш список как целое? Ответ заключается в том, что вы передаете свой список в качестве входного аргумента range, который ожидает целое число. Не делай этого. Скажите for i in myList.

Ответ 2

Вместо этого вы должны сделать это:

for i in myList:
    # etc.

То есть, удалите часть range(). Функция range() используется для генерации последовательности чисел и получает в качестве параметров пределы для создания диапазона, она не будет работать, чтобы передавать список в качестве параметра. Для повторения по списку просто напишите цикл, как показано выше.

Ответ 3

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
>>>

Ответ 4

удалите range.

for i in myList

диапазон принимает целое число. вы хотите для каждого элемента в списке.

Ответ 5

В playSound() вместо

for i in range(myList):

попробовать

for i in myList:

Это будет перебирать содержимое myList, которое, я считаю, является тем, что вы хотите. range(myList) не имеет никакого смысла.

Ответ 6

Ошибка из этого:

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

Вы не можете передать список range, который ожидает целое число. Скорее всего, вы хотели:

 def playSound(myList):
  for list_item in myList:

ИЛИ

 def playSound(myList):
  for i in range(len(myList)):

ИЛИ

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

Ответ 7

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)

Ответ 8

Для меня я получил эту ошибку, потому что мне нужно было поместить массивы в паратезы. Ошибка немного хитрая в этом случае...

то есть. concatenate((a, b)) является правильным

не concatenate(a, b)

надеюсь, что это помогает кому-то LOL