1

Pythonの文字列は、整数と同じように不変であると想定されています。このことを考慮:

>>> num1 = 34
>>> num2 = 36
>>> id(num1)
505894832
>>> num4 = 34
>>> id(num4)
505894832

num4num1とまったく同じIDを持っています。つまり、同じものを指しているということです。文字列でも同じことが起こるべきではありませんか?と混同されています:

>>> name = "Sumeet"
>>> id(name)
35692000
>>> name = "Ali"
>>> id(name)
35926912
>>> naam = "Sumeet"
>>> id(naam)
35926848

最後の出力は次のようにすべきではありません: 35692000

4

3 に答える 3

5

複数の変数が同じIDを持っているという事実は、実際のオブジェクトが不変であることとは何の関係もありません。

実際、これは不変であるため、安全に(メモリを節約して)発生する可能性があります。

Pythonの文字列が不変ではないと仮定して、次のように宣言します。

a = 'abc'

b = 'abc'

を変更した場合a、それはb完全に異なるオブジェクトを参照する(同じリテラル文字列を表すために必要なメモリを複製する)か、変更されたときaに変更を加えるためにオブジェクト全体をコピーする必要があることを意味します(bが影響を受けないようにするため)。

文字列は不変であるため、両方の変数が同じオブジェクトを安全に指すことができます。不変のデータ構造に変更を加えると、新しい構造が作成され、それを指していた参照が新しい構造に変更され、「古い」構造への他のすべての参照は変更されません。不変のデータ構造に副作用がないため、コード内の別の場所で共有構造/オブジェクトが変更されたためにエラーが発生する可能性が大幅に減少します。

于 2012-12-18T12:03:22.717 に答える
3

CPythonは、いくつかの非常に小さい整数と非常に小さい文字列をインターンしますが、実装に依存するため、これに依存することはできません。

それで、ここにあなたの発見に対するいくつかの反例があります:

>>> a = 123456
>>> b = 123456
>>> id(a)
30497296
>>> id(b)
30496144
>>> a = "hey"
>>> b = "hey"
>>> id(a)
44067112
>>> id(b)
44067112
于 2012-12-18T12:01:44.137 に答える
2

いいえ、明確で簡潔な理由の1つとして、同じことを指しているわけではありません。

これを行うとき:

name = 'Sumeet'

基本的に、新しいstringオブジェクトを作成し、それを参照にバインドしnameます。これを行うとき:

naam = 'Sumeet'

再びNEW stringオブジェクトを作成し、それを参照にバインドしnaamます。それらが同じオブジェクトを指すためには、これを行う必要があります。

naam = name

これにより、をnaam参照するのと同じオブジェクトがname参照されます。


整数に関しては、CPythonPythonの実装には小さな整数をキャッシュする機能があります。たとえば、このソースによると、 python3.2はから-5への整数オブジェクトをキャッシュし256ます。

于 2012-12-18T12:13:59.523 に答える