2015-10-17 8 views
11

Python標準ライブラリのprofile.pyを読むと、sys.argvを修正して正しいプロファイルを作成するための代入文sys.argv[:] = argsが出てきました。私は実際の操作でこれがsys.argv = args[:]と異なることを理解していますが、のが同じように見えます。誰かが1つではなく他のものを使いたいという状況がありますか?そして、a[:] = bは共通のPythonイディオムですか?スライスとの対比

更新:この特定の状況では、なぜ1つは他のものを選ぶでしょうか?あなたがa[:] = bを使用するとき、それはあなたがaにすでにあるものは何でも上書きすることを意味し、

答えて

9

差がある(ソースはprofile.pymain機能で見つけることができます)。 aへの参照がある他のものがあれば、同じ場所を参照し続けるので、同様に変更されます。

一方、a = b[:]は新しい参照を作成し、すべての値をbからこの新しい参照にコピーします。したがって、古いデータへの既存の参照は古いデータを指し続けるでしょう。

この例を考えてみましょう:

>>> a = [1, 2, 3] 
>>> b = [4, 5, 6] 
>>> c = a # c is a reference to the list in a 
>>> c 
[1, 2, 3] 
>>> 
>>> a[:] = b 
>>> a # a will have a copy of the list in b 
[4, 5, 6] 
>>> C# and c will keep having the same value as a 
[4, 5, 6] 
>>> 
>>> b = [7, 8, 9] 
>>> a = b[:] 
>>> a # a has the new value 
[7, 8, 9] 
>>> C# c keeps having the old value 
[4, 5, 6] 
+0

ありがとうございました、私は 'A' –

+3

は例を与えるために役立つかもしれないと、他の参照がある場合、これは違いを作ることに気づきました。 'a = b [:]'を実行すると、 'a'の_reference_を 'b'のコピーで置き換えます( 'a = b [:]'を実行すると 'x = [1、2、3]'、 'a = '; 'x'は変更されません。一方、 'a [:] = b'は' a'の内容(参照が変更されていない)を 'b'の値に置き換えます。これは' x'も変更されていることを意味します。参照結合は決して壊れていなかった。 – ShadowRanger

+0

私は詳細を編集するように編集しました。しかし、例は良いことでなければなりません。私はそれを追加します。 –

関連する問題