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

Cur*_*Sid 10 python perl

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

Nic*_*ood 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
$ 
Run Code Online (Sandbox Code Playgroud)

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

$ 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'
$
Run Code Online (Sandbox Code Playgroud)

如果你要转换perl成python那些将会引起你注意的主要因素.

  • @triplee`使用严格; 使用警告;`在这种情况下没有任何区别,它禁止使用未声明的变量,而不是未定义的字典项. (10认同)
  • 为了完整起见,我要提到Perl哈希的松散行为可以用[Hash :: Util](http://p3rl.org/Hash::Util)和[autovivification](http:// p3rl.组织/自动激活). (7认同)
  • 您应该使用严格;无论如何都要在所有Perl脚本中使用警告。这也将消除其中的一些差异。我想您会发现,大多数重要的区别都存在于语言的其他部分,例如Python的“一切都是对象”范例以及异常处理。 (2认同)

ste*_*enl 9

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

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