当函数被调用两次时,Python不会创建另一个对象

时间:2015-01-16 10:57:38

标签: python garbage-collection

我在Python中的函数内创建了一个对象。当函数结束时,应该删除对象的所有引用(只有一个实例),以及对象本身。

所以在示例中。

〜/ my_soft / my_program.py

from my_soft.my_module import deployers as D

def main():
    while True:
        ## ask and wait for user option
        if opt == 'something':
            D.my_function()

〜/ my_soft / my_module / deployers.py

from  my_soft.my_module import Deployer

def my_function():

    dep = Deployer(param1, param2)
    dep.do_something()

    return

〜/ my_soft / my_module / __初始化__。PY

class Deployer(object):
    def __init__(self, param1, param2):
        ## initialise my attributes

    def do_something(self):
        # method code

现在当我执行程序并第一次选择'something'选项时,它调用my_function并在变量dep中创建对象Deployer。函数返回时,应删除该对象。当我第二次输入选项'something'时,python再次调用my_function,同时它应该初始化另一个对象Deployer。 (即再次调用my_function时它不会创建另一个对象,但它使用与之前相同的内容)两者的内存位置相同,因此它们是同一个对象。

这是正常行为吗?我哪里错了?

2 个答案:

答案 0 :(得分:3)

  

两者的内存位置相同

除非您附加了C级调试器,否则我怀疑您是否拥有此信息。

  

所以他们是同一个对象。

因为CPython和PyPy编写得很好,所以你会期望它们以这种方式重用内存。事实上,我怀疑你正在看到回收的ids。

编辑:请注意,以这种方式回收ID是完全安全的。在任何时候都没有两个具有相同ID的对象。这可能出错的唯一方法是程序存储ID。没有理由这样做。

答案 1 :(得分:2)

Marcin是对的。这些对象重新使用与它们在范围内相同的内存位置。

#!/usr/bin/env python

import datetime

def main():
    while True:
        input()
        my_function()

def my_function():
    dep = Deployer()
    print(hex(id(dep)))
    dep.do_something()

class Deployer:
    def __init__(self):
        try:
            print(self.time)
        except AttributeError as ex:
            print(ex)

        self.time = datetime.datetime.now()

    def do_something(self):
        print(self.time)

if __name__ == "__main__":
    main()

输出:

'Deployer' object has no attribute 'time'
0x7f2072d79f60
2015-01-16 05:47:51.561046

'Deployer' object has no attribute 'time'
0x7f2072d79f60
2015-01-16 05:47:51.926064

'Deployer' object has no attribute 'time'
0x7f2072d79f60
2015-01-16 05:47:52.241109

'Deployer' object has no attribute 'time'
0x7f2072d79f60
2015-01-16 05:47:52.547327

'Deployer' object has no attribute 'time'
0x7f2072d79f60
2015-01-16 05:47:52.892630