Giải thích về lỗi: đối tượng 'noneType' không thể lặp lại
Trong python2, noneType là loại Không có. Trong Python3 noneType là lớp Không có, ví dụ:
>>> print(type(None)) #Python2
<type 'NoneType'> #In Python2 the type of None is the 'NoneType' type.
>>> print(type(None)) #Python3
<class 'NoneType'> #In Python3, the type of None is the 'NoneType' class.
Lặp lại một biến có giá trị Không thất bại:
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
Các phương thức Python trả về noneType nếu chúng không trả về giá trị:
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
Bạn cần kiểm tra các cấu trúc lặp của mình cho noneType như thế này:
a = None
print(a is None) #prints True
print(a is not None) #prints False
print(a == None) #prints True
print(a != None) #prints False
print(isinstance(a, object)) #prints True
print(isinstance(a, str)) #prints False
Guido cho biết chỉ sử dụng is
để kiểm tra None
vì is
mạnh mẽ hơn để kiểm tra danh tính. Đừng sử dụng các hoạt động bình đẳng bởi vì chúng có thể tạo ra viêm thực hiện bong bóng của riêng chúng. Nguyên tắc kiểu mã hóa của Python - PEP-008
Không ai là người lén lút và có thể lẻn vào từ lambdas:
import sys
b = lambda x : sys.stdout.write("k")
for a in b(10):
pass #TypeError: 'NoneType' object is not iterable
NoneType không phải là một từ khóa hợp lệ:
a = NoneType #NameError: name 'NoneType' is not defined
Nối None
và một chuỗi:
bar = "something"
foo = None
print foo + bar #TypeError: cannot concatenate 'str' and 'NoneType' objects
Những gì đang xảy ra ở đây?
Trình thông dịch của Python đã chuyển đổi mã của bạn thành pyc byodeode. Máy ảo Python đã xử lý mã byte, nó gặp phải một cấu trúc lặp mà nói lặp lại qua một biến chứa Không có. Các hoạt động được thực hiện bằng cách gọi __iter__
phương thức trên Không.
Không có __iter__
phương thức nào được xác định, vì vậy máy ảo của Python cho bạn biết những gì nó thấy: rằng noneType không có __iter__
phương thức.
Đây là lý do tại sao hệ tư tưởng gõ vịt của Python bị coi là xấu. Lập trình viên làm một cái gì đó hoàn toàn hợp lý với một biến và trong thời gian chạy, nó bị ô nhiễm bởi Không, máy ảo trăn cố gắng tiếp tục và tạo ra một loạt những điều vô nghĩa không liên quan trên thảm.
Java hoặc C ++ không có những vấn đề này bởi vì một chương trình như vậy sẽ không được phép biên dịch vì bạn chưa xác định phải làm gì khi Không có gì xảy ra. Python cung cấp cho lập trình viên rất nhiều dây để tự treo cổ bằng cách cho phép bạn làm nhiều việc không thể mong đợi để làm việc trong những trường hợp đặc biệt. Python là một người đàn ông có, nói có khi thưa ông khi điều đó ngăn bạn làm hại chính mình, giống như Java và C ++.
None
được ép thành chuỗi, nó phải tạo ra một chuỗi trống, hoàn toàn vô hại.