2012-05-20 16 views
8

Python'un sözlükleri için bir referans kullanılan karmaların çoğunda, perl için yeniyim. Fark ettiğim bir fark, karmaların elementlerin sırasını korumamasıdır. İkisi arasında daha somut ve temel farklılıklar olup olmadığını bilmek isterim.perl's hash ve python 'nun sözlükleri arasındaki fark

+13

Python sözlükleri öğelerin sırasını da korumaz. –

+6

Python sözlükleri öğelerin sırasını korumaz; hash tabloları olarak uygulanmaktadır. – Philipp

cevap

17

En temel fark, orada olmayan öğelere erişiyorsanız, perl karmalarının hata atmamasıdır.

$ 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 o python sizi dışarı yakalayacak ana şeyler perl edilir dönüştürme Eğer oto de piton

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

aksine öğeleri oluşturmak sağlamalarının.

+0

Sıkı kullanmalısınız; zaten tüm Perl betiklerinde uyarıları kullan. Bu da bu farklılıklardan bazılarını kaldıracaktır. Bence, önemli farklılıkların çoğunun, dillerin diğer kısımlarında, Python'un “her şey bir nesne” paradigması ve istisna işleminde olduğu gibi olduğunu göreceksiniz. – tripleee

+9

@triplee 'sıkı kullanın; uyarıları kullan; 'bu durumda herhangi bir fark yaratmaz, tanımlanmamış değişkenler, tanımlanmamış sözlük öğeleri kullanmamızı yasaklar. – ZyX

+0

Perl davranışını Python'da 'collections.defaultdict' ile taklit edebilirsiniz, ancak yine de nesne türleri hakkında endişelenmeniz gerekiyor. –

8

Diğer önemli fark, Python'da (kullanıcı tanımlı) nesneleri, sözlük anahtarlarınız olarak kullanabilmenizdir. Sözlükler bunu yönetmek için '__hash__ ve __eq__ yöntemlerini kullanır.

Perl'de, nesneleri varsayılan olarak karma anahtarları olarak kullanamazsınız. Anahtarlar, dizeler olarak depolanır ve anahtar olarak kullanmaya çalışırsanız nesneler dizelere enterpole edilir. (Ancak, nesneler, anahtar olarak Tie::RefHash gibi bir modülle bağlı bir karma kullanarak kullanılabilir.)