2012-05-20 22 views
8

Tôi mới làm quen với perl, ở hầu hết các nơi mà băm được sử dụng để tham chiếu đến từ điển của python. Một sự khác biệt mà tôi đã nhận thấy là các băm không bảo vệ trật tự của các phần tử. Tôi muốn biết nếu có một số khác biệt cụ thể và cơ bản hơn giữa hai người.sự khác biệt giữa băm của perl và từ điển python

+13

Từ điển Python cũng không giữ nguyên thứ tự của các phần tử. –

+6

Từ điển Python không giữ nguyên thứ tự của các phần tử; chúng được triển khai dưới dạng bảng băm. – Philipp

Trả lời

17

Sự khác biệt cơ bản nhất là băm perl không ném lỗi nếu bạn truy cập các phần tử không có ở đó.

$ python -c 'd = {}; print d["a"]' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
KeyError: 'a' 
$ perl -e '$d = {}; print $d->{a}' 
$ 

Perl băm tự động tạo ra các yếu tố quá không giống như python

$ python -c 'd = dict(); d["a"]["b"]["c"]=1' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
KeyError: 'a' 
$ perl -e '$d = {}; $d->{a}{b}{c}=1' 
$ 

Nếu bạn đang chuyển đổi perl-python những được những điều chính mà sẽ bắt bạn out.

+0

Bạn nên 'sử dụng nghiêm ngặt; sử dụng cảnh báo; 'trong tất cả các kịch bản Perl của bạn. Điều đó cũng sẽ loại bỏ một số sự khác biệt này. Tôi nghĩ bạn sẽ thấy rằng hầu hết các khác biệt đáng kể là ở các phần khác của ngôn ngữ, như mô hình "mọi thứ là một đối tượng" của Python, và trong xử lý ngoại lệ. – tripleee

+9

@triplee 'sử dụng nghiêm ngặt; sử dụng các cảnh báo; 'không tạo ra bất kỳ sự khác biệt nào trong trường hợp này, nó cấm bạn sử dụng các biến không khai báo, không phải các mục từ điển không được xác định. – ZyX

+0

Bạn có thể sắp xếp mô phỏng hành vi Perl bằng 'collections.defaultdict' bằng Python, nhưng bạn vẫn phải lo lắng về các loại đối tượng. –

8

Một khác biệt lớn là trong Python bạn có thể có các đối tượng (do người dùng định nghĩa) làm các khóa từ điển của bạn. Từ điển sẽ sử dụng các phương pháp '__hash____eq__' để quản lý điều này.

Trong Perl, bạn không thể sử dụng các đối tượng làm khóa băm theo mặc định. Các khóa được lưu trữ dưới dạng chuỗi và các đối tượng sẽ được nội suy thành các chuỗi nếu bạn cố gắng sử dụng chúng làm khóa. (Tuy nhiên, có thể sử dụng các đối tượng làm khóa bằng cách sử dụng hàm băm được gắn với một mô-đun như Tie::RefHash.)

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