2016-10-15 14 views
1

私はpythonを初めて使っていて、python3のドキュメントを使っていました。 Pythonでは、文字列は、その後、どのようにこの可能である不変であると言われている。文字列が不変の場合、これはどのように可能ですか?

if __name__ == '__main__': 
     l = 'string' 
     print(l) 
     l = l[:2] 
     print(l) 

戻り、この出力:

string 
st 
+0

文字列自体は不変です。ラベルが変わることがあります。 'string'は文字列であることを止めませんでした。あなたは、文字列の代わりに新しい文字列 'st'を指すように指示しました。 l [:2]は 'string'を切り取っていませんでした。 'string'から 'st'を取り出してからlに割り当てました – Daniel

+0

Pythonでスライスとビューを調べる –

答えて

3

非公式には、lは今のコピーである新しい不変の文字列、を指します古いものの一部。

文字列を変更することはできません。

a = "hello" 
a[0] = "b" # not allowed to modify the string `a` is referencing; raises TypeError 

print(a) # not reached, since we got an exception at the previous line 

いますが、この操作を行うことができます。

a = "hello" 
a = "b" + a[1:] # ok, since we're making a new copy 

print(a) # prints "bello" 
+0

"part of copy" ?あなたの例では – alanjo

+0

@ coderunner007、文字列の最初の部分をコピーしました。最初の2文字はより正確です。 –

+0

私はコピー部分を理解したと思います。文字列がスライスされると、文字列のコピーが作成されます。 – alanjo

2

この問題を理解するための鍵は、Pythonでその変数がちょうど基礎となるオブジェクトを指し示す「ポインタ」で実現することです。そして、あなたは不変オブジェクトと不変変数(Pythonには存在しない)という概念を混同しました。

たとえば、lは、当初、内容が "string"のstrオブジェクトを指すポインタでした。しかし、後で、コンテンツを "st"という新しいstrオブジェクトにリダイレクトします。プログラムが行l = l[:2]に実行されるとき、ポインタが指し示すオブジェクトではなく、ポインタが変更されていることに注意してください。そうであれば、lstr以外のタイプの別のオブジェクト、たとえばl = 123にリダイレクトすることもできます。 lstr "文字列")が指す元のオブジェクトは、まったく変更されていません。ガベージコレクションされていない限り、まだメモリに残っていますが、もはやlで指されていません。

不変オブジェクトの概念を理解するために、変更可能なオブジェクトを見てみましょう。たとえば、Pythonのlistは変更可能です。上記のコードで

l = [1, 2, 3] # a new list with three elements 
l.append(4) # append a new element 4 to the list (l is now modified!!!) 

、我々はそれに新たな要素を追加することによってl修飾。プログラム全体を通して、lは同じオブジェクトを指しますが、処理中に変更されるのはlによって指し示されるオブジェクトです。

+0

気にしない場合は、ポインタに関して "文字列が不変"であることを説明できますか? – alanjo

+0

確かに、私は自分の答えを編集しましたが、多分あなたが理解するのに数分かかるでしょう。 'str'オブジェクトが変更されたと思ったのは、あなたが"再割り当て "を"変更 "と間違えたのに対し、不変の手段は"変更できません "という理由です。エンジニアがあなたのチームに合っていないと思うような場合は、2つの選択肢があります。1.トレーニングに送る2.他のプログラマーと交換する。最初のケースは「変更」であり、2番目のケースは「再割り当て」です。 –

+0

ありがとう!私は再割り当てする必要があります:)) – alanjo

関連する問題