2012-02-16 45 views
12

Tôi đang thực hiện một chương trình nhỏ cho toán học (không có lý do cụ thể nào, chỉ là loại mong muốn) và tôi chạy vào đối tượng lỗi "TypeError: 'NoneType' không phải là . subscriptablePython Math - TypeError: đối tượng 'NoneType' không thể ghi được

tôi chưa bao giờ thấy trước đây lỗi này, vì vậy tôi không có ý tưởng những gì nó có nghĩa là

import math 

print("The format you should consider:") 
print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n") 

print("Do not include the letters in the input, it automatically adds them") 

v1 = input("Value 1: ") 
v2 = input("Value 2: ") 
v3 = input("Value 3: ") 
v4 = input("Value 4: ") 

lista = [v1, v3] 
lista = list.sort(lista) 

a = lista[1] - lista[0] 

list = [v2, v4] 
list = list.sort(list) 

b = list[1] = list[0] 

print str(a)+str("a")+str(" = ")+str(b) 

Các lỗi:.

Traceback (most recent call last): 
    File "C:/Users/Nathan/Documents/Python/New thing", line 16, in <module> 
    a = lista[1] - lista[0] 
TypeError: 'NoneType' object is not subscriptable 

Trả lời

21
lista = list.sort(lista) 

Điều này phải là

lista.sort() 

Phương thức .sort() được đặt tại chỗ và trả về Không. Nếu bạn muốn một cái gì đó không tại chỗ, trả về một giá trị, bạn có thể sử dụng

sorted_list = sorted(lista) 

Ngoài # 1: vui lòng không gọi cho danh sách của bạn list. Điều đó ghi đè loại danh sách được tạo sẵn.

Bên cạnh # 2: Tôi không chắc chắn những gì dòng này có nghĩa là để làm:

print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n") 

là nó chỉ đơn giản

print "value 1a + value 2 = value 3a value 4" 

? Nói cách khác, tôi không biết tại sao bạn đang gọi str trên những thứ đã được str.

Bên cạnh # 3: đôi khi bạn sử dụng print("something") (cú pháp Python 3) và đôi khi bạn sử dụng print "something" (Python 2). Sau này sẽ cung cấp cho bạn một SyntaxError trong py3, vì vậy bạn phải đang chạy 2. *, trong trường hợp đó bạn có thể không muốn nhận được trong thói quen hoặc bạn sẽ gió lên các bản in, với các dấu ngoặc đơn thêm. Tôi thừa nhận rằng nó sẽ hoạt động đủ tốt ở đây, bởi vì nếu chỉ có một phần tử trong ngoặc đơn thì nó không được hiểu là một bộ túp, nhưng có vẻ lạ đối với mắt pythonic ..

+0

Ah, cảm ơn bạn đã làm rõ. Ngoài ra, tôi sẽ không gọi danh sách danh sách của tôi trong các dự án lớn. Nhưng điều này chỉ đơn giản là dưới 20 dòng và tôi đã cảm thấy không sáng tạo: P. @ # 2 Không chắc chắn chính xác những gì tôi đã suy nghĩ, có lẽ tôi nghĩ rằng Python sẽ cố gắng thêm "giá trị 1a" với "giá trị 2". Sai lầm của tôi, tôi đã viết điều này ở giữa một lớp học ồn ào btw. @ # 3: Có, tôi đang sử dụng python 2.7 và cảm ơn bạn đã tư vấn, tôi thường cố gắng sử dụng in (""). –

12

Ngoại lệ TypeError: 'NoneType' object is not subscriptable xảy ra vì giá trị của lista thực ra là None. Bạn có thể tái tạo TypeError mà bạn nhận được trong mã của bạn nếu bạn cố gắng này tại dòng lệnh Python:

None[0] 

Lý do mà lista được thiết lập để None là do giá trị trở lại của list.sort()None ... nó không phải trả lại bản sao đã sắp xếp của danh sách gốc. Thay vào đó, dưới dạng documentation points out, danh sách sẽ được sắp xếp tại chỗ thay vì sao chép đang được thực hiện (đây là lý do hiệu quả).

Nếu bạn không muốn thay đổi phiên bản ban đầu bạn có thể sử dụng

other_list = sorted(lista) 
Các vấn đề liên quan