2015-01-20 17 views
9

Chức năng playSound lấy danh sách các số nguyên và sẽ phát âm thanh cho mọi số khác nhau. Vì vậy, nếu một trong các số trong danh sách là 1, 1 có âm thanh được chỉ định sẽ phát.TypeError: đối tượng 'list' không thể được hiểu là số nguyên

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) 

Tôi nhận được lỗi này:

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

Tôi đã thử một vài cách để chuyển đổi danh sách để số nguyên. Tôi không quá chắc chắn những gì tôi cần phải thay đổi. Tôi chắc chắn rằng có một cách hiệu quả hơn để làm điều này. Bất kỳ trợ giúp sẽ được đánh giá rất nhiều.

Trả lời

2

Bạn nên làm điều này thay vì:

for i in myList: 
    # etc. 

Đó là, loại bỏ các phần range(). Hàm range() được sử dụng để tạo ra một chuỗi các số và nó nhận được như các tham số giới hạn để tạo phạm vi, nó sẽ không hoạt động để chuyển một danh sách làm tham số. Để lặp qua danh sách, chỉ cần viết vòng lặp như được hiển thị ở trên.

2

range dự kiến ​​một cuộc tranh cãi nguyên, từ đó nó sẽ xây dựng một loạt các số nguyên:

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

Hơn nữa, cho nó một danh sách sẽ nâng cao một TypeErrorrange sẽ không biết làm thế nào để xử lý nó:

>>> range([1, 2, 3]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'list' object cannot be interpreted as an integer 
>>> 

Nếu bạn muốn truy cập các mục trong myList, vòng lặp trên danh sách trực tiếp:

for i in myList: 
    ... 

Demo:

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

Trong playSound(), thay vì

for i in range(myList): 

thử

for i in myList: 

này sẽ lặp qua các nội dung của myList, mà tôi tin là gì bạn muốn. range(myList) không có ý nghĩa gì cả.

1

Lỗi này là từ này:

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

Bạn không thể vượt qua một danh sách để range mà hy vọng một số nguyên.Nhiều khả năng, bạn có nghĩa là phải làm:

def playSound(myList): 
    for list_item in myList: 

HOẶC

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

HOẶC

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

tháo range.

for i in myList 

phạm vi mất một số nguyên. bạn muốn cho từng phần tử trong danh sách.

1
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) 
9

Thông báo lỗi thường có nghĩa là chính xác những gì họ nói. Vì vậy, họ phải được đọc rất cẩn thận. Khi bạn làm điều đó, bạn sẽ thấy rằng điều này không thực sự phàn nàn, như bạn có vẻ đã giả định, về loại đối tượng mà danh sách của bạn chứa, mà là về loại đối tượng, nó . Nó không nói rằng nó muốn danh sách của bạn chứa số nguyên (số nhiều) —instead, có vẻ như muốn danh sách của bạn là một số nguyên (số ít) thay vì danh sách bất kỳ thứ gì. Và vì bạn không thể chuyển đổi một danh sách thành một số nguyên (ít nhất, không theo cách có ý nghĩa trong ngữ cảnh này), bạn không nên thử.

Vì vậy, câu hỏi đặt ra là: tại sao trình thông dịch có vẻ muốn giải thích danh sách của bạn dưới dạng số nguyên? Câu trả lời là bạn đang chuyển danh sách của bạn như là đối số đầu vào cho range, mà mong đợi một số nguyên. Đừng làm thế. Thay vào đó, hãy nói for i in myList.

+1

hoặc 'cho i trong phạm vi (len (myList))' nếu tìm cách lặp qua các chỉ mục thay vì chính các phần tử. – 3yakuya

+2

hoặc 'cho chỉ mục, mục trong liệt kê (myList)' để giúp bạn cả hai, IMO dễ đọc hơn – jez

Các vấn đề liên quan