2016-06-27 21 views
-1

基本的に私の質問は、Pythonの関数に引数を渡し、それに他の値を代入してからその値を変更すると、両方の値が変更されるか、ただ一つになりますか? Pythonで関数の引数がどのくらい正確に渡されますか?言い換えれば引数はどのようにPythonの関数に渡されますか?

、次のように私は定義されたいくつかのクラスAを持っていたと言う:

クラスBは、いくつかのクラスである
class A(object): 

    def __init__(self, b): 
     self._b = b 

class B(object): 

    def increment(): 
     # Do something 

    ... 

(それが正確に何を本当に問題ではありません)とbと_bの両方のタイプがありますB.私が次のことをした場合:

instanceOfB = B() 
instanceOfA = A(instanceOfB) 
instanceOfA._b.increment() 

instanceOfBは変更されますか、それとも同じになりますか?

この質問が明確になることを願っています。私は何を求めているのかを説明するのに苦労しているので、自由に質問してください!

+0

に依存します。あなたが渡しているものが参照であり、リストにあるとしたら、その参照のコピーを変更するとそれらのすべてに影響を与えます。それが不変のオブジェクト、例えば文字列または整数またはタプルである場合、すべてのコピーは独立しています。つまり、これは実際に関数呼び出しとは関係がありません。あなたは割り当てとまったく同じ振る舞いをします。 –

+0

...それは: 'a = ; b = a;あなたの値が ''の 'a'を変更した場合、同じ振る舞いがその代入の背後にある関数呼び出しの後ろで起こります。関数呼び出しはそれとは関係ありません。 –

+0

'instanceOfB'と' instanceOfA._b' **の両方が同じ**オブジェクト**に**指しています**もしそのオブジェクトが変化すればすべてのポインタはその変更を反映しますが、一方の変数が別の値に割り当てられているとinstanceOfB = 4')これは他のポインタには影響しません。 –

答えて

2

あなたはここでいくつかのものをマングリングしています。あなたの例の関数のパラメータは変更されません。名前とパラメータが参照するオブジェクトのみです。

Pythonはポインタや参照に似た名前を使用します。名前はオブジェクトを参照していますが、オブジェクト自体ではありません。ここでは、instanceOfB(名前)にB(オブジェクト)のインスタンスを結合されています

instanceOfB = B() 

あなたが名前に名前の割り当てを行う場合は、名前の後ろに参照が効果的にコピーされます。同じオブジェクトを別々に参照する2つの名前があります。一方の名前を他のものに再割り当てすると、他方の名前は変更されません。

関数を呼び出すと、名前が値渡しされます。つまり、関数内で同じオブジェクトを参照する新しい名前(同じ名前でもよい)があります。

instanceOfA = A(instanceOfB) 
# -> A.__init__(self=instanceOfA, b=instanceOfB) 
# -> instanceOfA._b = instanceOfB 

ここまでは、名前を割り当てただけです。各割り当てで参照のコピーが作成されます。つまり、各名前は独立して動作します。しかし、複数の名前を持っていてもinstanceOfBは1つしかありません。 instanceOfA._binstanceOfBの両方が同じオブジェクトを指しています。

オブジェクトをに変更すると、これらのオブジェクトはすべて同じオブジェクトを参照するため、すべての名前でこの変更が表示されます。

+0

ありがとう、これは助けます! –

関連する問題