2017-06-27 5 views
1

Pythonの文字列が不変の場合、なぜPythonでは次の操作が許可されますか?Pythonで文字列が不変の場合、なぜPythonで上書き操作が許可されるのですか?

a = 'Hello' 
a = 'Hi' 
+0

「a」は文字列ではないためです。それは文字列を参照する名前です。それは[再]/[un]バインドすることができます。 –

+0

'a'はプロセス内で参照が変更されたことを確認します。 –

+3

文字列は不変です。バインドされた名前は 'a'ではありません。 – deceze

答えて

3

aが文字列ではなく、正確に文字列に(お好みであれば、ポインタに類似)参照/ハンドルですので。メモリアドレスを確認して確認することさえできます。

>>> a = "hello" 
>>> id(a) 
140102378280544 # memory address (not exactly but that's irrelevant to the topic) 
>>> a = 'hii' 
140102388086864 # different memory address than before 

Pythonの文字列は、1つの場所(ほとんど)に格納されているだけなので変更できません。したがって、変更することはできません。

>>> a = 'country' 
>>> b = 'country' 
>>> id(a) == id(b) 
True 
>>> a is b 
True 
+0

私もこれを知っています。私の疑問は、Pythonの文字列が不変である場合、上書きされた操作が許可される理由を意味しますか?メモリレベルではどうなるのでしょうか?どのメモリがこの操作を担当していますか? – veneth

+0

@venethまず、更新された回答を確認してください。新しい値を 'a'に代入すると、新しい値' hii'は 'hello'と同じメモリアドレスに格納されません。 Pythonの変数は、すでにデリファレンスされているポインタと似ています。ですから、面倒なことに言えば、 'aii 'に値' hii'を割り当てると、あるメモリアドレスに 'hii'を格納し、そのメモリアドレスの値を' a'に代入しています。 – hspandher

1
>>> a = 'Hello' 
>>> id(a) 
4519028800 
>>> a = 'Hi' 
>>> id(a) 
4519896088 

なく、同じ変数...私が言わなければならないのにidの値はせいぜい示すものです。

リテラルをaに再割り当てしようとすると、文字列は変更されません。文字列は同じままです。どのような変更参照aを指しています。

+1

なぜあなたは 'id'値が唯一の指標であると言いますか? –

+0

インタープリタセッションでは、同じ値を変数間で再利用することが可能です。 –

関連する問題