perl的hash和python的字典之间的区别

时间:2012-05-20 19:20:48

标签: python perl

我是perl的新手,在大多数使用哈希的地方都会给出对python词典的引用。我注意到的一个区别是哈希不保留元素的顺序。我想知道两者之间是否存在更具体和根本的差异。

2 个答案:

答案 0 :(得分:20)

最根本的区别是,如果访问不存在的元素,perl哈希不会抛出错误。

$ python -c 'd = {}; print("Truthy" if d["a"] else "Falsy")'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
KeyError: 'a'
$ perl -we 'use strict; my $d = {}; print $d->{"a"} ? "Truthy\n": "Falsy\n"'
Falsy
$ 

Perl哈希自动创建元素,与python

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

如果您要将perl转换为python,那么这些内容将会让您感到惊讶。

答案 1 :(得分:9)

另一个主要区别是,在Python中,您可以将(用户定义的)对象作为字典键。字典将使用对象的__hash____eq__方法来管理它。

在Perl中,默认情况下不能将对象用作哈希键。键存储为字符串,如果您尝试将它们用作键,则对象将插入到字符串中。 (但是,通过使用带有Tie::RefHash等模块的绑定哈希,可以将对象用作键。)