2009-12-09 57 views
6

我在創建類的實例來測試它們的函數內部運行for循環。而不是創造新的課程,它似乎一遍又一遍地重複使用相同的兩個課程。爲什麼python重用函數裏面的類實例

有沒有什麼我想知道如何在python方法中處理類和變量?

我怎麼能生成循環

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,) 

這裏的每個迭代一個新的對象是輸出

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 

當我使用單獨的變量名,我得到的每個實例單獨的ID作爲預期:

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))) 

輸出:

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

看起來你已經有了一個測試模擬對象......你可能希望仔細檢查你的模擬類的實例如何在測試用例中發揮作用。 – 2009-12-09 21:15:43

+0

@Jarret,很好,發佈測試對象的輸出很快 – 2009-12-09 21:19:15

回答

11

所有顯示的是對象的內存正在被重用,而不是新的對象沒有被實例化。在每次迭代中,collection正在被覆蓋,因此前一個對象的引用計數會下降,並且Python解釋器可以自由釋放其內存並重用它(用於下一個對象)。

>>> 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 

在這種情況下,2個內存位置正在被重新使用。如果你將它添加到列表(或保存在其他地方),將它保存下來:

>>> 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

從Python文檔:

ID() 返回一個對象的「身份」。這是一個整數(或長整數),在整個生命週期中保證這個對象是唯一的並且是常量。具有非重疊生命週期的兩個對象可能具有相同的id()值。

+0

非常好,謝謝你挖掘這個 – 2009-12-11 15:52:42

相關問題