Subscribed unsubscribe Subscribe Subscribe

Pythonの辞書は存在しないキーでアクセスしてはいけない → 改め、存在しないキーでアクセスする場合はget()を使う

Perlではハッシュから存在しないキーで値を取り出そうとするとundefが返ってくる。それを評価してプログラムを書いても動く。

$ perl -w
%hash = (foo => 'hoge', bar => 'fuga');
print $hash{baz} ? "あるよ!\n" : "ないよ!\n"

^D
ないよ!

Pythonの場合、存在しないキーで値を取り出そうとした瞬間にエラーが発生してしまう。

>>> hash = {'spam': 'hoge', 'ham': 'fuga'}
>>> print 'あるよ!' if hash['eggs'] else 'ないよ!'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'eggs'

ので、"has_key()"関数で辞書がそのキーを持っているかどうかを事前に確認してから値を取り出すようにする。

if hash.has_key('eggs'):
    print 'あったよ!'
else:
    print 'なかったよ!'


…しかし「ハッシュ」とか「辞書」とか「連想配列」とか呼び方が多すぎて困るわ。
大抵、Perlでは「ハッシュ」、Pythonでは「辞書」、JavaScriptなんかでは「連想配列」という呼び方で定着してしまっている気がするけど、これって自分の偏見なのだろうか?

追記

正確には同じものってワケじゃないのか。しっかり呼び分けるべきなのかな。
ハッシュとは - はてなキーワード
連想配列とは - はてなキーワード

追記

コメントをいただいたので修正。get()関数を使ってアクセスすれば例外は発生しない、とのこと!

>>> hash = {'spam': 'hoge', 'ham': 'fuga'}
>>> print hash['eggs']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'eggs'
>>> print hash.get('eggs')
None
>>>
>>> print 'あるよ!' if hash['eggs'] else 'ないよ!'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'eggs'
>>> print 'あるよ!' if hash.get('eggs') else 'ないよ!'
ないよ!
>>> 

本当だ! 知らなかった。。。orz