为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以接受列表作业的复制?

是否可以接受列表作业的复制?

largeQ 2023-04-25 15:24:03
考虑以下最小示例: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__。


查看完整回答
反对 回复 2023-04-25
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信