2017-11-12 4 views
0

元の文字列を変更します([カウント]新しい古い)パイソン2.7.13/3.6.1 str.replaceがstr.replaceは以下のように記載され、Pythonの3ドキュメントで一貫

str.replace

部分文字列oldがすべてnewで置き換えられた文字列のコピーを返します。オプションの引数countが指定された場合は、最初のcount個のオカレンスだけが置き換えられます。

これによれば、コード

old = [['z','b']] 
new = [] 
new.append(old[0]) 

print(old == new) 

new[0][0] = old[0][0].replace('z','a') 

print([old,new,old==new]) 

は、Python 2と3の両方で、それが実際に返し、しかし

True 
[[['z', 'b']], [['a', 'b']], False] 

を返すべきである:

True 
[[['a', 'b']], [['a', 'b']], True] 

意味をその古いヘクタールたとえドキュメンテーションがそうしてはならないことを暗示しているとしても、[['z'、 'b']]から[['a'、b ']]に変更されました。しかし、ドキュメンテーションがあまり言い表せられていないというわけではありません。 oldの値は毎回変更されません。それは変数をどのように定義するかによって、新しいに依存します。我々は異なるが(一見)と同等の方法で新しい定義する場合:我々は最初の場所で期待したものである

True 
[[['z', 'b']], [['a', 'b']], False] 

old = [['z','b']] 
new = [['z','b']] 

print(old == new) 

new[0][0] = old[0][0].replace('z','a') 

print([old,new,old==new]) 

を我々は出力が得られます。どちらの場合も、str.replaceが使用される前にold == newがTrueと評価されます。しかし、変数newを[['z'、 'b']]に設定する方法に応じて、str.replaceはの値を古いに変更します。

どのようにしてPythonは変数newの定義方法を "覚え"ていますか?それに応じて出力を変更しますか? Pythonは、2つの同等の新しい変数の間に異なるものがあることをどのように知っていますか?それにもかかわらず、なぜ古い価値が全く変わるのでしょうか? str.replaceは実際にそれを変更するのではなく、古いものの修正されたコピーを返してはいけませんか?

+0

を参照してください:SOベテランネッドBatchelderによって書かれた[Pythonの名前と値についての事実と神話](http://nedbatchelder.com/text/names.html)、 。 –

+0

ここで矛盾するものは何もなく、 'replace'は文字列を変更しません。 –

+0

文字列は不変であり、変更することはできませんが、リストオブジェクトは変更可能であることに注意してください。あなたの最初の例では、 'new [0]'を 'old [0]'と同じリストオブジェクトにします。これはコピーではありません。 2番目の例では、 'new [0]'リストは 'old [0]'リストオブジェクトと同じ値を持つ別のリストオブジェクトです。 –

答えて

0

あなたはoldの内容が、oldの参照をINGの.append(..)ではありません - old.copy()または.deepcopy()を使用する - あなたは同じオブジェクトを参照しない2つの別個の値を持っています。

第2の例では、同じデータに対する第1の使用ポイントで実質的にnewoldが異なるデータを指しています。

あなたはこの記事が参考に見つけることができHow to clone or copy a list?

関連する問題