考慮以下最小示例:class MyClass(): def __init__(self, length): self._list = [[] for _ in range(length)] def __setitem__(self, key, value): self._list[key] = value.copy() def __getitem__(self, key): return self._list[key]現在,Python 文檔說:Python 中的賦值語句不復制對象,它們在目標和對象之間創建綁定。應用上面的類意味著:>>> l = [[1,2,3,4], [3,2,1,0]]>>> C = MyClass(2)>>> C[0] = l[0]這確實是一個賦值語句。但是這些值現在是副本:>>> C[0] == l[0]True>>> C[0] is l[0]False對于 Python 中的類,這是可接受的行為嗎?
1 回答

繁星點點滴滴
TA貢獻1803條經驗 獲得超3個贊
這本身并沒有錯。只要你的課程有很好的記錄,如果你有充分的理由去做,那就去做吧??紤]標準庫模塊中的以下類shelve,它本質上提供了一個類似 dict 的數據庫接口。由于使用object[key] = value將寫入磁盤,檢索該對象將從磁盤檢索它,它不會給你相同的對象(必然有緩存選項)!所以:
In [1]: import shelve
In [2]: data = [[1,2,3],[4,5,6]]
In [3]: database = shelve.open('db')
In [4]: database['key'] = data[0]
In [5]: database['key']
Out[5]: [1, 2, 3]
In [6]: database['key'] is data[0]
Out[6]: False
文檔的那部分是指對變量的賦值語句,如下所示:
some_var = foo
確實,它從不復制。而且你不能真正改變它(好吧,也許吧,但這是另一個問題)。__setitem__您可以隨心所欲地實施__getitem__。
添加回答
舉報
0/150
提交
取消