私はPython 3.xデータモデルをよりよく理解したいと思います。しかし、私はPython Objectの振る舞いを完全かつ正確に説明していません。Pythonオブジェクトメカニズムの深い理解
私は参考文献を探していますが、下に示すすべてのケースをPython APIリファレンスやPEPなどの貴重なものにリンクさせることができれば嬉しいです。あなたは賢明な助言のためにさらにいただきありがとうございます...
みましょう、我々はテスト目的のためにいくつかの複雑なPythonの構造を持っていると言う:
d1 = {
'id': 5432
,'name': 'jlandercy'
,'pets': {
'andy': {
'type': 'cat'
,'age': 3.5
}
,'ray': {
'type': 'dog'
,'age': 6.5
}
}
,'type': str
,'complex': (5432, 6.5, 'cat', str)
,'list': ['milk', 'chocolate', 'butter']
}
1)不変原子オブジェクトは
どのような方法でシングルトンです私は新しい整数を作成します。
n1 = 5432
n2 = int(5432)
n3 = copy.copy(n1)
n4 = copy.deepcopy(n1)
この番号の新しいコピーは作成されず、代わりに新しいものが作成されますオブジェクトはd1['id']
です。もっと簡潔に
d1['id'] is n1
...
彼らはすべて同じid
を持っていない、従って私はそれがシングルトンで、値が5432でint
の新しいインスタンスを作成することはできません。
2)不変と反復処理可能なオブジェクトはシングルトンであるかもしれない...
前の観測も不変と反復可能である、str
のために働きます。以下のすべての変数:
s1 = 'jlandercy'
s2 = str('jlandercy')
s3 = copy.copy(s1)
s4 = copy.deepcopy(s1)
最初に作成されたコピー先はd1['name']
です。文字列もシングルトンです。
...ではなく、正確に...
タプルも不変と反復可能ですが、彼らは、文字列のように動作しません。
() is()
しかし、他のタプルではない:魔法の空のタプルがシングルトンであることを知っています。
t1 = (5432, 6.5, 'cat', str)
...代わりに、彼らは同じように
をハッシュ彼らは同じid
を持っていない:
id(d1['complex']) != id(t1)
しかし、これら二つの構造内のすべての項目はアトミックなので、同じ方向にポイントインスタンス。
hash(d1['complex']) == hash(t1)
そこで彼らは、辞書のキーとして使用することができます。重要な点は、両方の構造hash
同じ方法です。これはネストされたタプルでも当てはまります。
t2 = (1, (2, 3))
t3 = (1, (2, 3))
これらは同じhash
を持っています。二重の間接参照によって辞書を渡す
3)は、それのようシャローコピー
は、次の関数を定義できます動作します。
最初の二重間接参照(**
オペレータ)によって、当社のトライアル辞書を受け取ります def f1(**kwargs):
kwargs['id'] = 1111
kwargs['pets']['andy'] = None
学位会員はコピーされますが、最も深いものは参考にされます。この単純なプログラムの
出力は、それを示しています
{'complex': (5432, 6.5, 'cat', <class 'str'>),
'id': 5432,
'list': ['milk', 'chocolate', 'butter'],
'name': 'jlandercy',
'pets': {'andy': {'age': 3.5, 'type': 'cat'},
'ray': {'age': 6.5, 'type': 'dog'}},
'type': <class 'str'>}
{'complex': (5432, 6.5, 'cat', <class 'str'>),
'id': 5432,
'list': ['milk', 'chocolate', 'butter'],
'name': 'jlandercy',
'pets': {'andy': None, 'ray': {'age': 6.5, 'type': 'dog'}},
'type': <class 'str'>}
辞書d1
が機能f1
によって変更された、完全ではない:
print(d1)
f1(**d1)
print(d1)
それを返します。メンバーid
'はコピーを作成したので元に戻りますが、メンバーpets
も辞書であり、浅いコピーはそれをコピーせずに変更されました。
この動作は、dict
オブジェクトのcopy.copy
の動作に似ています。オブジェクトの再帰的かつ完全なコピーを持つにはcopy.deepcopy
が必要です。
私の要求は、次のとおりです。
は私の観測が正しく解釈されていますか?
不変原子オブジェクトは
不変と反復処理可能なオブジェクトはシングルトンであるかもしれないではなく、まさにその代わり、彼らは二重の間接参照によって辞書を渡す均等
はそれ
の浅いコピーを作品ハッシュシングルトンです
- これらの動作はどこかで十分に文書化されていますか?
- それぞれのケースについて正しいプロパティ&ビヘイビアを示します。
あなたの答えはかなり完成しています。他のポップアップがあればもう少しお待ちしております。とにかくありがとうございました。 – jlandercy
それはsenceを@jlandercyにして、あなたが思うように多くの時間を与えます:-) –
[2]でハッシュに情報を追加できますか?不変でiterable(stdlibのみ)のハッシュは常に同じ方法ですか?たとえば、私はnamed_tupleまたはタプル "原子型"を使用する必要がありますか?ありがとう – jlandercy