Tạo một danh sách trống trong Python


243

Cách tốt nhất để tạo một danh sách trống mới trong Python là gì?

l = [] 

hoặc là

l = list()

Tôi hỏi điều này vì hai lý do:

  1. Lý do kỹ thuật, như là nhanh hơn. (tạo một lớp gây ra chi phí?)
  2. Mã dễ đọc - cái nào là quy ước chuẩn.

4
"nhanh hơn"? Tại sao bạn không chạy thời gian?
S.Lott

Câu trả lời:


335

Đây là cách bạn có thể kiểm tra đoạn mã nào nhanh hơn:

% 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

Tuy nhiên, trong thực tế, việc khởi tạo này rất có thể là một phần cực kỳ nhỏ trong chương trình của bạn, vì vậy việc lo lắng về điều này có lẽ là sai lầm.

Dễ đọc là rất chủ quan. Tôi thích [], nhưng một số người rất hiểu biết, như Alex Martelli, thích list()bởi vì nó có thể phát âm được .


12
Wow, cảm ơn vì hồ sơ. Tôi đã luôn muốn biết làm thế nào nó được thực hiện.
user225312

Tại sao không list('')cho []thay vì ['']?
Chris_Rands

Điều này là do func này tạo danh sách từ các loại lặp, bạn không thể chèn nhiều hơn 1 đối số. (Hãy thử gõ list('abcd')và bạn hiểu tất cả mọi thứ)
Ivan Lavrenov

133

list()vốn dĩ chậm hơn [], bởi vì

  1. có tra cứu biểu tượng (không có cách nào để trăn biết trước nếu bạn không chỉ xác định lại danh sách là một cái gì đó khác!),

  2. có chức năng gọi

  3. sau đó nó phải kiểm tra xem đã có đối số lặp được thông qua chưa (để nó có thể tạo danh sách với các phần tử từ nó) ps. không có gì trong trường hợp của chúng tôi nhưng có "nếu" kiểm tra

Trong hầu hết các trường hợp, sự khác biệt tốc độ sẽ không tạo ra bất kỳ sự khác biệt thực tế nào.


38
+1: Cảm thấy tốt để hiểu tại sao list()chậm hơn []!
Eric O Lebigot

2
Trong trường hợp, list()nó chỉ phải kiểm tra xem có bất kỳ đối số nào không ... "kiểm tra xem có thể lặp lại được không" và "tạo danh sách với các phần tử" chỉ không xảy ra; họ chỉ áp dụng nếu có một đối số. Thậm chí có khả năng mã C để []gọi cùng mã C là list(). Trong mọi trường hợp, thời gian liên quan đến (c) sẽ rất nhỏ so với (a) + (b).
John Machin

1
@ John Machin - xin lỗi vì sự nhầm lẫn, ý của tôi là (c) là nó sẽ cần kiểm tra xem có tranh luận không, vâng. phần còn lại là về những gì sẽ xảy ra nếu có tranh luận, trong trường hợp của chúng tôi không có gì
Nas Banov

16

Tôi sử dụng [].

  1. Nó nhanh hơn vì ký hiệu danh sách là một mạch ngắn.
  2. Tạo một danh sách với các mục nên trông giống như tạo một danh sách mà không có, tại sao phải có sự khác biệt?

3

Tôi không thực sự biết về nó, nhưng theo kinh nghiệm của tôi, dường như jpcgt thực sự đúng. Ví dụ sau: Nếu tôi sử dụng mã sau

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

trong trình thông dịch, sau đó gọi t chỉ cho tôi "t" mà không có bất kỳ danh sách nào, và nếu tôi nối thêm thứ gì khác, vd

t = t.append(2)

Tôi nhận được lỗi "'noneType' đối tượng không có thuộc tính 'append'". Tuy nhiên, nếu tôi tạo danh sách bằng cách

t = list() # explicit instantiation

sau đó nó hoạt động tốt


15
Đó là bởi vì t.append(1)Sửa ttại chỗ, nó không trả lại bất cứ điều gì nhưng Nonevà bạn đang gán này Noneđể t. Vì vậy, tbây giờ đề cập đến Nonethay vì vào danh sách. Lỗi của bạn ở đây là viết t=t.append(1)thay vì chỉ t.append(1). Bạn sẽ nhận thấy hành vi tương tự với list(), vì vậy không có sự khác biệt ở đây.
Darkonaut

1

Chỉ để làm nổi bật câu trả lời @Darkonaut bởi vì tôi nghĩ rằng nó sẽ được hiển thị nhiều hơn.

new_list = []hoặc new_list = list()cả hai đều ổn (bỏ qua hiệu suất), nhưng append()trả về None, kết quả là bạn không thể làm new_list = new_list.append(something.

Tôi rất bối rối trước một quyết định kiểu trả lại như vậy. Kinh quá.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.