为什么python在函数中重用一个类实例

时间:2009-12-09 21:11:03

标签: python namespaces class

我在一个函数中运行for循环,该函数创建一个类的实例来测试它们。而不是制作新的课程似乎重复使用相同的两个。

我是否缺少关于如何在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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

来自python文档:

ID() 返回对象的“标识”。这是一个整数(或长整数),保证在该生命周期内该对象是唯一且恒定的。具有非重叠生存期的两个对象可能具有相同的id()值。