2011-08-12 19 views
7

私はPythonを理解し始めていると思いますが、基本的な質問にはまだ問題があります。 copy.copyをいつ使用しますか?python copy.copyを使用する場合

>>>a=5 
>>>b=a 
>>>a=6 
>>>print b 
5 

OKです。しかし、どのような状況では、b=aという形で、aとbの間に何らかの「リンク」があり、aを変更するとbを修正するのでしょうか?これは私が約copy.copyを得ることはありません - あなたが値をコピーするだけの等号と別の変数に割り当てるたびにですか?

+2

Pythonでの割り当て* never *は値をコピーします。 –

答えて

21

基本的には、b = aポイントbからaポイントまでです。

あなたが求めているのは、変更可能なタイプです。数字、文字列、タプル、フーチェンセット、ブール値Noneは不変です。リスト、辞書、セット、bytearraysは変更可能です。

私は可変タイプを作る場合

listのように:

>>> a = [1, 2] # create an object in memory that points to 1 and 2, and point a at it 
>>> b = a  # point b to wherever a points 
>>> a[0] = 2 # change the object that a points to by pointing its first item at 2 
>>> a 
[2, 2] 
>>> b 
[2, 2] 

彼らは両方ともまだ同じ項目を指します。

私もあなたの元のコードにコメントます:

>>>a=5  # '5' is interned, so it already exists, point a at it in memory 
>>>b=a  # point b to wherever a points 
>>>a=6  # '6' already exists in memory, point a at it 
>>>print b # b still points at 5 because you never moved it 
5 

何かがid(something)をすることによってメモリ内を指しているあなたは、常に見ることができます。

>>> id(5) 
77519368 
>>> a = 5 
>>> id(a) 
77519368  # the same as what id(5) showed us, 5 is interned 
>>> b = a 
>>> id(b) 
77519368  # same again 
>>> id(6) 
77519356 
>>> a = 6 
>>> id(a) 
77519356  # same as what id(6) showed us, 6 is interned 
>>> id(b) 
77519368  # still pointing at 5.  
>>> b 
5 

構造体のコピーを作成する場合は、copyを使用します。ただし、はまだ何かのコピーを作成しませんinterned。これには、256,True,False,Noneなどの短い文字列、aなどの短い文字列が含まれます。基本的には、ほとんどは使用しないでくださいあなたがインターンに邪魔されないことが確実でない限り、

>>> a = [1, 2] 
>>> b = a 
>>> a = a[:1] # copy the list a points to, starting with item 2, and point a at it 
>>> b   # b still points to the original list 
[1, 2] 
>>> a 
[1] 
>>> id(b) 
79367984 
>>> id(a) 
80533904 

リスト(あなたが使用するたびに:)を作るのスライス:

は古い変数を変更していない、まだ新しいものでは一つの変数を指して、でも変更可能なタイプで示したもう一つの例を考えてみましょうコピー。

+0

優れた答えです。私は常に、不変の型が値でコピーされていて、参照ではないことを知っていました。今私はなぜ知っている! – wbg

3

割り当ては決してコピーされません。ただaの参照(例に固執する)のオブジェクトをbにリンクするだけです。 abは、1つのリンクを変更するまで同じオブジェクトを参照します。

「変数」を用語としてドロップすると便利です。オブジェクトに貼り付けたラベル、オブジェクトに到達するために使用できるハンドルなどです。

copy.copyこれはまったく変更されません。

数字や文字列でも変更を伝播したい場合は、ここで不変性の表示が行われます。数値と文字列を別のオブジェクトにラップし、abに割り当てる必要があります。

逆の場合はcopyモジュールを使用する必要がありますが、必ずドキュメントを読んでください。しかし、オブジェクトの用語でではなく、という変数を考える必要があります。

+3

http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables – Evpok

関連する問題