我有一個屬性是一個列表的對象。例如:python - 按值或按引用傳遞
obj.a = [3, 4, 5]
我想獲得以下行爲(但我不能管理使用魔法的/ etc找到一個解決方案。):
l = obj.a
obj.a[0] = 2
print(l) --> [3, 4, 5]
print(obj.a) ---> [2, 4, 5]
當然,我可以簡單地使用拷貝.deepcopy:
l = copy.deepcopy(obj.a)
但出於幾個原因,我想以某種方式使此步驟自動/隱藏它爲我的用戶。
[編輯] 使用的getAttribute並返回一個副本當然不是工作:
import copy
class Test:
def __init__(self):
self.a = []
def __getattribute__(self, attr):
if attr == 'a':
return copy.deepcopy(super(Test, self).__getattribute__(attr))
任何幫助表示讚賞!
Thnak你, 托馬斯
如果您不想在操作過程中使用副本並在操作過程中將其留在操作過程中而沒有在操作過程中明確複製列表,則無法執行此操作。換句話說,從python的角度來看,從第一行到第二行的'obj.a'訪問沒有什麼不同,所以沒有魔法信號可以讓你隱藏某些情況下的複製操作,而不是其他情況。 – mgilson
[如何在Python中複製或複製列表?]可能重複(http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list-in-python) – deceze
你可能重寫'obj.a'屬性總是返回一個列表的副本...但是,這將是相當昂貴的,並打破了許多假設,你*期望*不*複製的正常行爲。當你需要一份副本時,明確地說明它。 – deceze