5

今日、Python が式{}をキャッシュし、変数に割り当てられたときに新しい空の dict に置き換えることを学びました。

print id({})
# 40357936

print id({})
# 40357936

x = {}
print id(x)
# 40357936

print id({})
# 40356432

ソースコードは見ていませんが、これがどのように実装されるかについての考えはあります。(おそらく、グローバルへの参照カウント{}がインクリメントされると、グローバル{}が置き換えられます。)

しかし、このビットを考慮してください:

def f(x):
    x['a'] = 1
    print(id(x), x)

print(id(x))
# 34076544

f({})
# (34076544, {'a': 1})

print(id({}), {})
# (34076544, {})

print(id({}))
# 34076544

fグローバル dict を置き換えずに変更し、変更された dict を出力します。しかしf、id が同じであるにもかかわらず、グローバル dict は空になりました!

何が起こっている??

4

2 に答える 2

6

キャッシュされていません。{}どこにも結果を代入しない場合、その参照カウントは 0 になり、すぐにクリーンアップされます。たまたま、割り当てた次のメモリが古いメモリから再利用されました。それをに割り当てると、xそれが生き続け、次のものは別のアドレスになります。

あなたの関数の例では、fあなたの辞書への参照が残っていないので、それもクリーンアップされ、同じことが当てはまります。

于 2013-03-27T19:30:08.657 に答える
4

Python はここでキャッシュを行っていません。id()プログラムの異なるポイントで同じ戻り値を返す場合、次の2 つの可能性があります。

  1. id()同じオブジェクトで 2 回呼び出されました
  2. 呼び出された最初のオブジェクトid()は、2 番目のオブジェクトが作成される前にガベージ コレクションされ、2 番目のオブジェクトは元のオブジェクトと同じメモリ位置に作成されました。

この場合、それは2番目のものでした。これはprint id({}); print id({})、同じ値が 2 回出力される場合でも、各呼び出しが個別のオブジェクトに対して行われることを意味します。

于 2013-03-27T19:31:36.743 に答える