私は理解できない小さな問題があります。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
を参照してください。この質問は、*厳密*変更可能なデフォルト値に関係ありませんが、*デフォルト値が作成されるとき*についてです。 @tomekは、すべての関数がデフォルト値の** 'tuple' **を' __defaults__'属性に保持していることに注意してください。しかし、これはどういう意味ですか?まあ、確かに 'tuple'は不変な関数なので、呼び出されるたびにデフォルト値を作ることができないので、デフォルト値は関数*定義*で一度だけ作成されます。 'someObject'を' def func():print( "called") 'のような関数で変更し、この関数がいつ呼び出されるかを見てください。 – Bakuriu
これは良い質問です。関数が関数定義ではなく関数実行時に評価される第2クラスのオブジェクトであるC++土地から来たとき、私は確かに混乱しました。 – Shashank