私はpythonを初めて使っていて、python3のドキュメントを使っていました。 Pythonでは、文字列は、その後、どのようにこの可能である不変であると言われている。文字列が不変の場合、これはどのように可能ですか?
if __name__ == '__main__':
l = 'string'
print(l)
l = l[:2]
print(l)
戻り、この出力:
string
st
私はpythonを初めて使っていて、python3のドキュメントを使っていました。 Pythonでは、文字列は、その後、どのようにこの可能である不変であると言われている。文字列が不変の場合、これはどのように可能ですか?
if __name__ == '__main__':
l = 'string'
print(l)
l = l[:2]
print(l)
戻り、この出力:
string
st
非公式には、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"
この問題を理解するための鍵は、Pythonでその変数がちょうど基礎となるオブジェクトを指し示す「ポインタ」で実現することです。そして、あなたは不変オブジェクトと不変変数(Pythonには存在しない)という概念を混同しました。
たとえば、l
は、当初、内容が "string"のstr
オブジェクトを指すポインタでした。しかし、後で、コンテンツを "st"という新しいstr
オブジェクトにリダイレクトします。プログラムが行l = l[:2]
に実行されるとき、ポインタが指し示すオブジェクトではなく、ポインタが変更されていることに注意してください。そうであれば、l
をstr
以外のタイプの別のオブジェクト、たとえばl = 123
にリダイレクトすることもできます。 l
(str
"文字列")が指す元のオブジェクトは、まったく変更されていません。ガベージコレクションされていない限り、まだメモリに残っていますが、もはや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
によって指し示されるオブジェクトです。
気にしない場合は、ポインタに関して "文字列が不変"であることを説明できますか? – alanjo
確かに、私は自分の答えを編集しましたが、多分あなたが理解するのに数分かかるでしょう。 'str'オブジェクトが変更されたと思ったのは、あなたが"再割り当て "を"変更 "と間違えたのに対し、不変の手段は"変更できません "という理由です。エンジニアがあなたのチームに合っていないと思うような場合は、2つの選択肢があります。1.トレーニングに送る2.他のプログラマーと交換する。最初のケースは「変更」であり、2番目のケースは「再割り当て」です。 –
ありがとう!私は再割り当てする必要があります:)) – alanjo
文字列自体は不変です。ラベルが変わることがあります。 'string'は文字列であることを止めませんでした。あなたは、文字列の代わりに新しい文字列 'st'を指すように指示しました。 l [:2]は 'string'を切り取っていませんでした。 'string'から 'st'を取り出してからlに割り当てました – Daniel
Pythonでスライスとビューを調べる –