Ada dua hal utama yang perlu dipertimbangkan di sini:
- Mengharapkan hasil
'/segment/segment/'.split('/')
menjadi sama dengan ['segment', 'segment']
adalah wajar, tetapi kemudian ini kehilangan informasi. Jika split()
bekerja seperti yang Anda inginkan, jika saya memberi tahu Anda itu a.split('/') == ['segment', 'segment']
, Anda tidak dapat memberi tahu saya apa yang a
terjadi.
- Apa yang seharusnya menjadi hasil
'a//b'.split()
? ['a', 'b']
?, atau ['a', '', 'b']
? Yaitu, harus split()
menggabungkan pembatas yang berdekatan? Jika harus, maka akan sangat sulit untuk mengurai data yang dibatasi oleh karakter, dan beberapa bidang bisa kosong. Saya cukup yakin ada banyak orang yang melakukan menginginkan nilai-nilai yang kosong dalam hasil untuk kasus di atas!
Pada akhirnya, itu bermuara pada dua hal:
Konsistensi: jika saya memiliki n
pembatas, di a
, saya mendapatkan n+1
nilai kembali setelah split()
.
Seharusnya mungkin untuk melakukan hal-hal kompleks, dan mudah untuk melakukan hal-hal sederhana: jika Anda ingin mengabaikan string kosong sebagai akibat dari split()
, Anda selalu dapat melakukan:
def mysplit(s, delim=None):
return [x for x in s.split(delim) if x]
tetapi jika seseorang tidak ingin mengabaikan nilai kosong, Anda harus melakukannya bisa.
Bahasa harus memilih satu definisi split()
— ada terlalu banyak kasus penggunaan yang berbeda untuk memenuhi persyaratan setiap orang sebagai default. Saya pikir pilihan Python itu bagus, dan paling logis. (Sebagai tambahan, salah satu alasan saya tidak suka C.strtok()
adalah karena ini menggabungkan pembatas yang berdekatan, membuatnya sangat sulit untuk melakukan parsing / tokenisasi yang serius dengannya.)
Ada satu pengecualian: a.split()
tanpa argumen menekan ruang kosong yang berurutan, tetapi orang dapat berargumen bahwa ini adalah hal yang benar untuk dilakukan dalam kasus itu. Jika Anda tidak menginginkan perilaku tersebut, Anda selalu bisa a.split(' ')
.