2010-04-30 65 views

Trả lời

22

d=dict() đòi hỏi một tra cứu trong locals() sau đó globals() sau đó __builtins__, d={} không

+0

Không, 'dict' nằm trong' __builtin__'. –

+0

@MikeGraham có nhưng trong hầu hết các trường hợp '__builtins__' là một bí danh cho' __builtin__' – jamylak

9

Nếu mọi người sử dụng (chỉ) dict() theo (chỉ cần) {}, nó thường bởi vì họ không biết về {} (đó là khá một kỳ công), hoặc bởi vì họ nghĩ rằng nó rõ ràng hơn (chủ quan, nhưng không phổ biến.)

Có những điều bạn có thể làm với dict mà bạn không thể làm với {}, mặc dù, chẳng hạn như chuyển nó đến thứ gì đó một calla ble, giống như collections.defaultdict(dict). Ngoài ra còn có một thực tế rằng bạn có thể gọi dict với các đối số từ khóa, trong đó một số người thích:

>>> dict(spam=1, ham=2) 
{'ham': 2, 'spam': 1} 

Cá nhân, tôi thích cú pháp đen dict vì nó hoạt động tốt hơn khi bạn muốn sử dụng các phím mà không phải là định danh hợp lệ:

>>> dict(pass=1) 
File "<stdin>", line 1 
    dict(pass=1) 
     ^
SyntaxError: invalid syntax 
>>> dict('ham and eggs'=1) 
    File "<stdin>", line 1 
SyntaxError: keyword can't be an expression 

(và trộn phong cách chỉ vì một số phím không định danh hợp lệ, yuck.)

42

tôi là một trong những người thích từ ngữ để chấm câu - đó là một trong những lý do tôi đã chọn Python trên Perl, ví dụ. "Cuộc sống là tốt hơn mà không có niềng răng" (một phương châm Python cũ mà đã đi trên một T-shirt với một phim hoạt hình của một thiếu niên mỉm cười ;-), sau khi tất cả (ban đầu dự định để tham khảo niềng răng vs indentation cho nhóm, tất nhiên, nhưng, hey , niềng răng là niềng răng! -).

"Thanh toán" một số nano giây (với mục đích sử dụng từ ngắn, dễ đọc thay vì niềng răng, dấu ngoặc và whatnots) nói chung là giá cả phải chăng (chủ yếu là chi phí tra cứu vào không gian tên được xây dựng) trả tiền mỗi khi bạn sử dụng một loại hoặc chức năng tích hợp sẵn, và bạn có thể tối ưu hóa nó một cách nhẹ nhàng bằng cách nâng một số công cụ tìm kiếm ra khỏi vòng lặp).

Vì vậy, tôi thường là người thích viết dict() cho {}, list(L) thay L[:] cũng như list() cho [], tuple() cho (), và vân vân - chỉ là một sở thích phong cách chung của phát âm được mã. Khi tôi làm việc trên một codebase hiện có sử dụng một phong cách khác, hoặc khi đồng đội của tôi trong một dự án mới có sở thích mạnh theo cách khác, tôi có thể chấp nhận điều đó, tất nhiên (không phải cố gắng truyền giáo một chút trong trường hợp của các đồng đội) ;-).

+0

"treo một số tra cứu ra khỏi vòng" - điều này có nghĩa là gì? – Tshepang

+9

@Tshepang, ví dụ: thay vì 'cho i trong x: f (dict())' (tìm kiếm 'len (x)' cho tên 'dict'), trước tiên hãy liên kết một' d = dict' cục bộ bên ngoài vòng lặp, sau đó là 'for i in x: f (d()) 'tìm kiếm _local_ nhanh hơn cho tên' d').Đó là một kỹ thuật Python cơ bản để tối ưu hóa một số vòng lặp khi chúng được chứng minh (bằng cách lược tả, tất nhiên) là tắc nghẽn hiệu suất. –

+1

Ngẫu nhiên (và không liên quan đến câu hỏi này, tất nhiên), Unladen Swallow sẽ làm cho loại thành ngữ này (d = dict) không cần thiết :) – rbp

1

Như Thomas đã nói, tôi sử dụng dict() để tôi có thể chỉ định từ khóa. Đặc biệt nếu tôi xây dựng một từ điển lớn để khởi tạo dữ liệu hoặc không có điều gì: có thể sử dụng cú pháp từ khóa giúp tôi tiết kiệm được hai lần nhấn phím (và sự lộn xộn trực quan liên quan) cho mọi phần tử.

6

Doug Hellmann đã viết hết số comparison của hiệu suất chênh lệch.

Các vấn đề liên quan