2009-12-09 6 views
6

Sto eseguendo un ciclo for all'interno di una funzione che sta creando istanze di una classe per testarle. invece di creare nuove classi sembra riutilizzare sempre gli stessi due.perché Python riutilizza un'istanza di classe all'interno della funzione

C'è qualcosa che mi manca su come le classi e le variabili vengono gestite nei metodi Python?

come posso generare un nuovo oggetto per ogni iterazione

class CollectionSetImages(unittest.TestCase): 
    def test_keywordset(self): 
     """Testing keyword queries by images equality """ 

     for keyword in ['a','b','c','d','e','f','g']: 
      images_by_keyword = Image.keyword_query([keyword]) 
      collection = Collection([keyword]) 
      class_images = collection.images 
      print('colleciton: %s id: %s' % (collection,id(collection))) 
      self.assertEqual(images_by_keyword, class_images,) 

qui è l'uscita

colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656cc> id: 3083228876 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656ec> id: 3083228908 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656cc> id: 3083228876 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656ec> id: 3083228908 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656cc> id: 3083228876 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656ec> id: 3083228908 
colleciton: <tests.fakeimages._FakeCollection object at 0xb7c656cc> id: 3083228876 

quando uso nomi di variabili separate ottengo ids separati per ogni istanza come previsto :

collectionA = Collection(['a']) 
print('collection: %s id: %s' % (collectionA,id(collectionA))) 

collectionB = Collection(['f']) 
print('collection: %s id: %s' % (collectionB,id(collectionB))) 

collectionC = Collection(['f']) 
print('collection: %s id: %s' % (collectionC,id(collectionC))) 

uscite:

collection: <tests.fakeimages._FakeCollection object at 0xb7cbc8ac> id: 3083585708 
collection: <tests.fakeimages._FakeCollection object at 0xb7cbccec> id: 3083586796 
collection: <tests.fakeimages._FakeCollection object at 0xb7cbcd2c> id: 3083586860 
+1

Sembra che tu abbia un oggetto fittizio di prova lì dentro ... potresti voler ricontrollare come l'istanza della tua classe di simulazione entra in gioco nel caso di test. –

+0

@ Jarret, buon punto, pubblicazione dell'output degli oggetti di prova a breve –

risposta

11

Tutto ciò dimostra che la memoria degli oggetti sia riutilizzato, non che nuovi oggetti non vengono istanziata. In ogni iterazione, collection viene sovrascritto, quindi il numero di riferimento dell'oggetto precedente scende e l'interprete Python è libero di deallocare la sua memoria e riutilizzarla (per l'oggetto successivo).

>>> for a in range(1,5): 
...  b = object() 
...  print b, id(b) 
... 
<object object at 0xb7db9470> 3084620912 
<object object at 0xb7db9468> 3084620904 
<object object at 0xb7db9470> 3084620912 
<object object at 0xb7db9468> 3084620904 
<object object at 0xb7db9470> 3084620912 

In questo caso, vengono riutilizzate 2 posizioni di memoria. Se si dovesse aggiungere a un elenco (o salvarlo altrove), si sarebbe conservata:

>>> a = [] 
>>> for b in range(1,5): 
...  c = object() 
...  a.append(c) 
...  print c, id(c) 
... 
<object object at 0xb7db9470> 3084620912 
<object object at 0xb7db9468> 3084620904 
<object object at 0xb7db9478> 3084620920 
<object object at 0xb7db9480> 3084620928 
3

dalla documentazione python:

id() Riportare la “identità” di un oggetto. Questo è un intero (o un intero lungo) che è garantito essere unico e costante per questo oggetto durante la sua vita. Due oggetti con vite non sovrapposte possono avere lo stesso valore id().

+0

molto bello, grazie per averlo scoperto –

Problemi correlati