Penjelasan kesalahan: Objek 'NoneType' tidak dapat diubah
Dalam python2, NoneType adalah tipe None. Dalam Python3 NoneType adalah kelas None, misalnya:
>>> 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.
Iterasi atas variabel yang memiliki nilai Tidak ada yang gagal:
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
Metode Python mengembalikan NoneType jika mereka tidak mengembalikan nilai:
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
Anda perlu memeriksa konstruksi perulangan Anda untuk NoneType seperti ini:
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 mengatakan hanya digunakan is
untuk memeriksa None
karena is
lebih kuat untuk memeriksa identitas. Jangan menggunakan operasi kesetaraan karena mereka dapat meludahkan implementasi bubble-up sendiri. Pedoman Gaya Pengodean Python - PEP-008
NoneTypes adalah Sneaky, dan dapat menyelinap masuk dari lambdas:
import sys
b = lambda x : sys.stdout.write("k")
for a in b(10):
pass #TypeError: 'NoneType' object is not iterable
NoneType bukan kata kunci yang valid:
a = NoneType #NameError: name 'NoneType' is not defined
Rangkaian None
dan string:
bar = "something"
foo = None
print foo + bar #TypeError: cannot concatenate 'str' and 'NoneType' objects
Apa yang terjadi di sini?
Penerjemah Python mengonversi kode Anda menjadi bytecode pyc. Mesin virtual Python memproses bytecode, ia menemukan looping construct yang mengatakan iterate pada variabel yang mengandung None. Operasi dilakukan dengan memohon__iter__
metode pada Tidak Ada.
Tidak ada yang tidak memiliki __iter__
metode yang ditentukan, jadi mesin virtual Python memberi tahu Anda apa yang dilihatnya: bahwa NoneType tidak memiliki__iter__
metode.
Inilah sebabnya mengapa bebek-mengetik Python ideologi dianggap buruk. Programmer melakukan sesuatu yang sepenuhnya masuk akal dengan variabel dan pada saat runtime itu terkontaminasi oleh None, mesin virtual python mencoba untuk menjadi tentara, dan memunculkan sekelompok omong kosong yang tidak terkait di seluruh karpet.
Java atau C ++ tidak memiliki masalah ini karena program seperti itu tidak akan diizinkan untuk dikompilasi karena Anda belum menentukan apa yang harus dilakukan ketika Tidak ada yang terjadi. Python memberi banyak tali kepada programmer untuk menggantung dirinya sendiri dengan memungkinkan Anda melakukan banyak hal yang seharusnya tidak dapat diharapkan bekerja dalam keadaan luar biasa. Python adalah yes-man, mengatakan yes-sir ketika itu akan menghentikan Anda dari merugikan diri sendiri, seperti Java dan C ++.
None
dipaksa sebagai urutan itu harus menghasilkan urutan kosong, sama sekali tidak berbahaya.