【发布时间】:2020-11-24 22:00:28
【问题描述】:
考虑以下最小示例:
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 中的类来说,这是可以接受的行为吗?
【问题讨论】:
-
你为什么要这样做?
-
这很难解释。我参与了 SageMath 项目,我们正在处理可变元素,即张量。
-
我需要一个将张量保存在列表中的类。但这是一个全新的可变元素。与原始张量的联系可能会变得不可见。问题是通过复制进行列表分配是否是一种想要的行为。
-
此外,我们想添加一个方法,使这个元素不可变。让张量在此过程中不可变可能对用户来说是不可取的。
-
这是可以接受的,只是令人惊讶的行为。
标签: python copy variable-assignment assignment-operator