2012-05-20 37 views
8

我是新來的perl,在大多數使用散列的地方給出了對python字典的引用。我注意到的一個區別是哈希不保存元素的順序。我想知道兩者之間是否存在一些更具體和根本性的差異。perl的散列和python的字典之間的區別

+13

Python字典不保留元素的順序。 –

+6

Python字典不保留元素的順序;它們被實現爲散列表。 – Philipp

回答

17

最根本的區別是,如果訪問那些不存在的元素,perl散列不會拋出錯誤。

$ 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的哈希自動創建元素太不像蟒蛇

$ 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' 
$ 

如果要轉換perlpython這些是主要的東西會抓住你了。

+0

你應該'嚴格使用;使用警告;無論如何,在所有的Perl腳本中。這也將消除這些差異。我想你會發現大多數重要的差異都在語言的其他部分,比如Python的「一切都是對象」範例,以及異常處理。 – tripleee

+9

@triplee'嚴格使用;使用警告;'在這種情況下沒有任何區別,它禁止你使用未聲明的變量,而不是未定義的字典項目。 – ZyX

+0

你可以在Python中用'collections.defaultdict'來模擬Perl的行爲,但是你仍然需要真正擔心對象的類型。 –

8

另一個主要區別是,在Python中,可以將(用戶定義的)對象作爲字典鍵。字典將使用對象'__hash____eq__方法來管理這個。

在Perl中,默認情況下不能使用對象作爲散列鍵。鍵被存儲爲字符串,並且如果您嘗試將它們用作鍵,則會將對象插入到字符串中。 (但是,可以通過使用與模塊(如Tie::RefHash)模塊相連的哈希來將對象用作關鍵字。)