2013-09-05 31 views
6

Anlamadığım küçük bir sorunum var.Python - neden yeni bir nesne örneği oluşturmuyor?

object.appendMethod() 

Ve aslında SomeObject aynı örneğinde listeyi ekleyin:

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

Ben nitelikler olmadan bu yöntemi çağırın:

Ben bir yöntemi var.

Ama bunun için değiştirirseniz:

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

O nesnenin yeni instance'a her zaman olsun, ne fark eder?

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

görüyorum ama yaklaşık * * varsayılan değerler oluşturulduğunda olduğunu. @tomek, her işlevin, '__defaults__' özniteliğinde varsayılan değerlerinden ** tuple' ** kaldığını unutmayın. Ama bu ne anlama geliyor? Elbette, tuple'lar değişmez fonksiyonlar olduğundan * her çağrıldığında varsayılan bir değer oluşturamazlar, dolayısıyla varsayılan değer sadece * bir kez * fonksiyonda * tanım * oluşturulur. 'someObject' işlevini' def func(): print ("çağrılıyor") 'gibi bir işlevle değiştirmeyi deneyin ve bu işlevin ne zaman çağrıldığını görün. – Bakuriu

+0

Bu iyi bir soru. C++ 'dan geldiğimde, fonksiyonun fonksiyon tanımından ziyade fonksiyon tanımından değerlendirilen ikinci sınıf nesneler olduğu arazi beni kesinlikle şaşırttı. – Shashank

cevap

2

bir değişken nesne olarak varsayılan argüman atama Bunun nedeni:

İşte bir örnek.

Python'da, işlev, tanımlandığında değerlendirilen bir nesnedir. Bu nedenle, def appendList(self, new = someClass()) yazdığınızda, new işlevinin bir üyesi nesnesi olarak tanımlanır ve yürütme zamanında yeniden değerlendirilmez.

bu soru * kesinlikle * değişken varsayılan değere ilişkili değildir “Least Astonishment” in Python: The Mutable Default Argument

+0

Teşekkürler, şimdi ne olduğunu anlıyorum. Bu bana karşı sezgisel, ama anlıyorum. Fonksiyonları objeler olarak düşünmeyi unuttum. –

İlgili konular