Membuat daftar kosong dengan Python

243

Apa cara terbaik untuk membuat daftar kosong baru dengan Python?

l = [] 

atau

l = list()

Saya menanyakan ini karena dua alasan:

  1. Alasan teknis, mana yang lebih cepat. (membuat kelas menyebabkan overhead?)
  2. Keterbacaan kode - yang mana adalah konvensi standar.
pengguna225312
sumber
4
"lebih cepat"? Mengapa kamu tidak menjalankan timeit?
S.Lott

Jawaban:

335

Inilah cara Anda menguji potongan kode mana yang lebih cepat:

% python -mtimeit  "l=[]"
10000000 loops, best of 3: 0.0711 usec per loop

% python -mtimeit  "l=list()"
1000000 loops, best of 3: 0.297 usec per loop

Namun, dalam praktiknya, inisialisasi ini kemungkinan besar adalah bagian yang sangat kecil dari program Anda, jadi khawatir tentang hal ini mungkin salah arah.

Keterbacaan sangat subyektif. Saya lebih suka [], tetapi beberapa orang yang sangat berpengetahuan, seperti Alex Martelli, lebih suka list()karena itu bisa diucapkan .

unutbu
sumber
12
Wow, terima kasih untuk profilnya. Saya selalu ingin tahu bagaimana melakukannya.
user225312
Mengapa list('')memberi []bukan ['']?
Chris_Rands
Ini karena fungsi ini membuat daftar dari tipe yang dapat diubah, Anda tidak dapat memasukkan lebih dari 1 argumen. (Cobalah untuk mengetik list('abcd')dan Anda mengerti segalanya)
Ivan Lavrenov
133

list()secara inheren lebih lambat daripada [], karena

  1. ada pencarian simbol (tidak ada cara bagi python untuk mengetahui sebelumnya jika Anda tidak mendefinisikan ulang daftar menjadi sesuatu yang lain!),

  2. ada doa fungsi,

  3. maka ia harus memeriksa apakah ada argumen iterable yang diteruskan (sehingga dapat membuat daftar dengan elemen darinya) ps. tidak ada dalam kasus kami tetapi ada "jika" periksa

Dalam kebanyakan kasus perbedaan kecepatan tidak akan membuat perbedaan praktis.

Nas Banov
sumber
38
+1: Rasanya senang memahami mengapa list()lebih lambat daripada []!
Eric O Lebigot
2
Dalam hal list()ini hanya untuk memeriksa apakah ada arg sama sekali ... "periksa apakah dapat diubah" dan "buat daftar dengan elemen" tidak terjadi; mereka hanya berlaku jika ada arg. Bahkan mungkin kode C untuk []panggilan kode C sama dengan list(). Dalam kasus apa pun waktu yang terlibat dalam (c) akan kecil dibandingkan dengan (a) + (b).
John Machin
1
@ John Machin - maaf atas kebingungan, yang saya maksud dalam (c) adalah bahwa ia perlu memeriksa apakah ada pertengkaran, ya. sisanya tentang apa yang akan terjadi jika ada pertengkaran, yang dalam kasus kami tidak ada
Nas Banov
16

Saya menggunakan [].

  1. Lebih cepat karena notasi daftar adalah hubungan pendek.
  2. Membuat daftar dengan barang - barang harus terlihat sama dengan membuat daftar tanpa, mengapa harus ada perbedaan?
Georg Schölly
sumber
3

Saya tidak benar-benar tahu tentang itu, tetapi menurut saya, berdasarkan pengalaman, bahwa jpcgt sebenarnya benar. Contoh berikut: Jika saya menggunakan kode berikut

t = [] # implicit instantiation
t = t.append(1)

di penerjemah, lalu memanggil t memberi saya hanya "t" tanpa daftar apa pun, dan jika saya menambahkan sesuatu yang lain, misalnya

t = t.append(2)

Saya mendapatkan kesalahan "objek 'NoneType' tidak memiliki atribut 'append'". Namun, jika saya membuat daftar dengan

t = list() # explicit instantiation

maka itu berfungsi dengan baik.

Yinyue
sumber
15
Itu karena t.append(1)memodifikasi tdi tempat, tidak mengembalikan apa-apa tapi Nonedan Anda menetapkan ini Noneuntuk t. Jadi tmerujuk sekarang Nonedaripada ke daftar. Kesalahan Anda di sini adalah menulis, t=t.append(1)bukan hanya t.append(1). Anda akan melihat perilaku yang sama list(), jadi tidak ada perbedaan di sini.
Darkonaut
1

Hanya untuk menyoroti jawaban @Darkonaut karena saya pikir itu harus lebih terlihat.

new_list = []atau new_list = list()keduanya baik-baik saja (mengabaikan kinerja), tetapi append()kembali None, akibatnya Anda tidak dapat melakukannya new_list = new_list.append(something.

Saya sangat bingung dengan keputusan tipe pengembalian seperti itu. Yuck.

oVo
sumber