2015-01-16 75 views
0

我在Python中的函數中創建一個對象。當函數結束時,所有對象的引用都應該被刪除(只有一個實例),以及對象本身。當函數被調用兩次時,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/__ init__.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時,它不會創建另一個對象,但它會像以前一樣使用它)。兩者的內存位置相同,因此它們是同一個對象。

這是正常行爲嗎?我錯在哪裏?

回答

3

存儲位置是兩個

除非你是一個連接C級調試器一樣,我懷疑你有這個信息。

因此它們是同一個對象。

因爲CPython和PyPy編寫得很好,所以您會期望它們以這種方式重用內存。事實上,我懷疑你看到了ID的回收。

編輯:還請注意,這種方式的回收ids是完全安全的。任何時候都不會有兩個物體擁有相同的ID。唯一的出路就是程序存儲ID。沒有理由這樣做。

+1

@ Atem18嘗試引進一些變化到第一對象,但不是第二個,看是肯定的,如果他們真的一樣。 –

+0

@ivan_pozdeev這是不可能的;測試永遠不會在函數調用中保留該對象。這就是爲什麼這種ID的回收發生。 – Marcin

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 
相關問題