2017-12-21 7 views
0

この質問は非常に具体的な質問ではありませんが、私はいくつかの例を挙げることができます。変数が新しいオブジェクトを指しているときや、同じオブジェクトを指す2つの変数があるときは決して知りませんので、私はPythonを非常に恐れています。同じオブジェクトに変数を代入するのとは逆に、新しいオブジェクトがPythonでいつ作成されるかを知る方法

は、例えば、私はこのように割り当てることを怖がっています:私はself.valueを変更した場合、数は変更したくない。この場合

def function(self): 
    number = self.value 
    return number 

。私はリストを変更した場合、リスト2にも望ましくないとする変更されます。この場合、

list = [1,2,3] 
list2 = list 

はまた同じようにリストをコピーします。なぜ私はそれを新しい変数にしたくないのですか?とにかく

誰もがこれらのケースで新しい変数を作成するための安全な方法を知っているか、多分、新しいオブジェクトが作成されたときに2つの変数が同じオブジェクトを指すときの完全な説明を持っている場合、私は疑問に思います。私は平和の中でコードを作成したいと思います。私のコードが大きいので、いつも心配する必要はなく、どの変数が変更されたのか、どの計算後に変更されていないのか確認することはできません。質問は、質問へのリンクので、可変性と不変性に関連している

Immutable vs Mutable types、 は良いかもしれませんが、これは、いくつかのために役立つかもしれない質問をする別の方法です。また、これは突然変異を避けることに重点を置いています。

+2

シンプルルール:割り当て**決して**新しいオブジェクトを作成します。割り当ての後、常に左の名前は単に右のオブジェクトを参照します。 –

+0

私は常に新しい変数Aに値を代入しなければなりません。次に変数Bの値をAに代入することができます。これは常にオブジェクトのコピーを作成しますか? –

+0

[変更不可能な種類と変更可能な種類](https://stackoverflow.com/questions/8056130/immutable-vs-mutable-types)の可能な複製 – jwodder

答えて

1

多くの言語のように、いくつかのオブジェクトは可変であると言われ、またいくつかは不変であると言われています。不変オブジェクトとは、一度作成したオブジェクトを変更することができないオブジェクトです(intなど)。前の例で

x = 3 
y = x 

両方xy同じオブジェクトに、しかし3は不変であるので、それは問題ではありません。

いくつかの他の目的はlistなど、変更可能です。つまり、価値を変える方法があるということです。ここ

l1 = [1, 2, 3] 
l2 = l1 # This does not copy the object, it simply makes the name l2 point to it 
int

が起こるの場合とまったく同じでは、両方の変数が同じオブジェクトを指すが、そのオブジェクトを変更する方法が存在します。例としてl2.append(4)を実行します。

あなたがここで話していることを避ける最良の方法は、優れた方法を採用することです。たとえば、関数を純粋に保ち、そうでないときは明確にします。

純粋な関数は、副作用がなく、新しいオブジェクトを返す関数です。だから、に変更しても、引数はそれらを返しますが、コピーして新しいものを返します。 deepcopyを使用するために、あなたが与えた例では

は、それを達成するための方法は次のようになります。

from copy import deepcopy 

l1 = [1, 2, 3] 
l2 = deepcopy(l1) # Here deepcopy actually created a new object and returned it 

私は約which objects are mutable and which are notを読み、その新しい知識に基づいて、あなたの慣行を調整することをお勧めします。

+0

すべてのオブジェクトとタイプでディープコピーを使用できますか? –

+1

これは '__deepcopy__'関数を持つすべてのオブジェクト上で実行できます。 'deepcopy'はすべてそのメソッドを呼び出します。 –

+0

私はこのdeepcopy機能が本当に好きです。本当に私の心配はすべてx))!それは私がこれまでに遭遇したことはないと思います。私はここ数年間、Pythonを使ってきました。 –

関連する問題