だから、私はこれを知っています、
a = {} # dict
空の辞書を作成します。さて、これも取り上げました。
b = {1, 2, 3} # set
セットを作成します。これは、次のように簡単に確認できます。
>>>print(type(a))
<class 'dict'>
>>>print(type(b))
<class 'set'>
私はそれが何をするのか理解していますが、whyが見当たりません。セットと辞書の両方に同じ構文を使用しています。マニュアルの set
および dict
セクションで、この背後にあるロジックに関する情報を見つけようとしましたが、残念ながら、それから何も得られませんでした。
この方法でこれを行う理由を誰かが説明できますか?それは歴史的な理由によるものですか、それともあからさまに明らかな何かを見逃していますか?
set literalsはありませんでしたPython 2、歴史的に中括弧は辞書にのみ使用されていました。セットはリスト(または任意のイテラブル):
_set([1, 2, 3])
set([i for i in range(1, 3)])
_
Python 3は、中間リストを回避できるセットリテラルと内包表記( PEP-31 を参照)を導入しました。
_{1, 2, 3}
{i for i in range(1, 3)}
_
ただし、空のセット形式は、後方互換性のために辞書用に予約されていました。 [Python-3000] P3Kで設定? 状態からの参照:
何か解決できると確信しています---同意します。空の辞書には_
{}
_、空の辞書には_{:}
_が理想的です。 PEPを最初に書いたときに「特別な空のオブジェクト」のアイデアが好きでした(つまり、_{}
_をセットまたはディクテーションに変えることができます)。初心者の心の混乱に加えて(実装するのが面倒です)。
後続のメッセージ は、これらのルールをより詳しく説明しています。
Guidoが最善の解決策だったと思います。空のセットには
set()
を使用し、空のディクテーションには_{}
_を使用し、セットの内包/表示には_{genexp}
_を使用し、明示的なセットリテラルには_{1,2,3}
_を使用し、_{k1:v1, k2:v2}
_ dictリテラル用。需要が嫌悪感を超える場合は、後で_{
_/_}
_をいつでも追加できます。
構文はnotと同じです。辞書は最初に中括弧を使用し、key-valueペアを指定します。ここで、キーと値はコロンで区切られます。
_>>> {'foo': 'bar'}
{'foo': 'bar'}
>>> type(_)
<type 'dict'>
_
後で言語にセットが追加され、_{..}
_波括弧表記は名前だけelementsであり、ペアではありません:
_>>> {'foo'}
set(['foo'])
>>> type(_)
<type 'set'>
_
Python 2)では、インタープリターはset()
呼び出し可能オブジェクトを使用してオブジェクトをエコーします。これはemptyセットを指定する方法でもあります。
_>>> emptyset = set()
_
Python 3)では、オブジェクトが空でない限り、新しい_{..}
_表記がオブジェクトをエコーするときに使用されます。
_>>> {'foo'}
{'foo'}
>>> _ - {'foo'} # difference, removing the one element
set()
_
set()
タイプは、Python言語の バージョン2.4 ( PEP 218 を参照)、中括弧に追加されましたセットリテラルの構文は added in Python and back-ported to Python 2.7 。
{}
が空のセットではなく空の辞書に使用されるという事実には、主に歴史的な理由があります。辞書の{'a': 100, 'b': 200}
構文は、Pythonの初めから存在していました。セットの構文{1, 2, 3}
は、Python 2.7。で導入されました。{}
は長い間使用されてきたため、空の辞書を定義する方法として残ります。 Pythonが最初から新しいセット構文を持っている場合、空のセットは{}
で定義され、空の辞書は{:}
で定義される可能性があります。