2010-08-26 102 views
1

我寫了這個簡單的python程序來幫助我處理另一個程序中的錯誤。它清楚地說明了這個問題。有人可以幫我嗎?在不同的函數之間維護Python對象

import copy 

class Obj(object): 
    def __init__(self, name): 
     self.name = name 

def one(o): 
    print("1: o.name:", o.name) # "foo" 
    obackup = copy.deepcopy(o) 
    o.name = "bar" 
    print("2: o.name:", o.name) # "bar" 
    print("3: obackup.name:", obackup.name) # "foo" 
    o = obackup 
    print("4: o.name:", o.name) # "foo" 

def two(o): 
    print("5: o.name:", o.name) # "bar"! 

def main(): 
    o = Obj("foo") 
    one(o) 
    two(o) 

main() 

我的猜測是,o被莫名其妙地改寫爲局部變量的函數one()。但我不知道如何解決這個問題。

回答

0

oone()的局部變量,因此無法優雅地修復此問題。但您可以使用一些 參考/指針,您將其傳遞給one()two()

Simulating Pointers in Python

+0

由於超出範圍,一個新的綁定。很高興知道沒有簡單的解決方法。我現在通過讓所有相關函數返回對象來修復它。 – Violet 2010-08-26 21:24:42

+0

重構代碼(如前所述,返回對象工作正常)比試圖模擬指針要好得多。 – habnabit 2010-08-26 22:37:27

2

忘了說copy模塊存在,它幾乎從來沒有需要,往往會產生意想不到的結果。

只要你說o = obackupone()你已經創建了一個正式的參數,它再經過print('4...

相關問題