gpt4 book ai didi

python - 为什么python在函数内部重用类实例

转载 作者:太空狗 更新时间:2023-10-29 22:10:09 25 4
gpt4 key购买 nike

我在一个函数内运行一个 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

最佳答案

所有这一切都表明对象的内存正在被重用,而不是新对象没有被实例化。在每次迭代中,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

关于python - 为什么python在函数内部重用类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1876905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com