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:
- Lý do kỹ thuật, như là nhanh hơn. (tạo một lớp gây ra chi phí?)
- Mã dễ đọc - cái nào là quy ước chuẩn.
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:
Câu trả lời:
Đâ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 .
list('')
cho []
thay vì ['']
?
list('abcd')
và bạn hiểu tất cả mọi thứ)
list()
vốn dĩ chậm hơn []
, bởi vì
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!),
có chức năng gọi
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.
list()
chậm hơn []
!
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).
Tôi sử dụng []
.
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
t.append(1)
Sửa t
tại chỗ, nó không trả lại bất cứ điều gì nhưng None
và bạn đang gán này None
để t
. Vì vậy, t
bây giờ đề cập đến None
thay 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.
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á.