2013-09-05 14 views
6

私は理解できない小さな問題があります。Python - なぜオブジェクトの新しいインスタンスを作成しないのですか?

私は方法があります:

def appendMethod(self, newInstance = someObject()): 
    self.someList.append(newInstace) 

私は属性なしでこのメソッドを呼び出します。

object.appendMethod() 

そして実際に私はSomeObjectのの同じインスタンスのリストを追加します。

しかし、私はそれを変更した場合:私は、そのオブジェクトの新しいインスタンスを毎回取得

def appendMethod(self): 
    newInstace = someObject() 
    self.someList.append(newInstance) 

、違いは何ですか?

class someClass(): 
    myVal = 0 

class otherClass1(): 

    someList = [] 

    def appendList(self): 
     new = someClass() 
     self.someList.append(new) 

class otherClass2(): 

    someList = [] 

    def appendList(self, new = someClass()): 
     self.someList.append(new) 

newObject = otherClass1() 
newObject.appendList() 
newObject.appendList() 
print newObject.someList[0] is newObject.someList[1] 
>>>False 

anotherObject = otherClass2() 
anotherObject.appendList() 
anotherObject.appendList() 
print anotherObject.someList[0] is anotherObject.someList[1] 
>>>True 
+0

を参照してください。この質問は、*厳密*変更可能なデフォルト値に関係ありませんが、*デフォルト値が作成されるとき*についてです。 @tomekは、すべての関数がデフォルト値の** 'tuple' **を' __defaults__'属性に保持していることに注意してください。しかし、これはどういう意味ですか?まあ、確かに 'tuple'は不変な関数なので、呼び出されるたびにデフォルト値を作ることができないので、デフォルト値は関数*定義*で一度だけ作成されます。 'someObject'を' def func():print( "called") 'のような関数で変更し、この関数がいつ呼び出されるかを見てください。 – Bakuriu

+0

これは良い質問です。関数が関数定義ではなく関数実行時に評価される第2クラスのオブジェクトであるC++土地から来たとき、私は確かに混乱しました。 – Shashank

答えて

2

あなたは可変オブジェクトとしてデフォルトの引数を割り当てているので、これは次のとおりです。

は、ここでの例です。

Pythonでは、関数は定義時に評価されるオブジェクトです。したがって、def appendList(self, new = someClass())と入力すると、newを関数のメンバーオブジェクトとして定義しており、実行時に再評価されません。

“Least Astonishment” in Python: The Mutable Default Argument

+0

ありがとう、今私は何が起こるかを理解する。それは私には直感的ですが、私はそれを得ます。私は関数をオブジェクトとして考えるのを忘れていました。 –

関連する問題