【问题标题】:How can I copy an immutable object like tuple in Python?如何在 Python 中复制像元组这样的不可变对象?
【发布时间】:2013-02-19 07:11:08
【问题描述】:

copy.copy()copy.deepcopy() 只是复制不可变对象(如元组)的引用。 如何在不同的内存位置创建第一个不可变对象的副本?

【问题讨论】:

  • oldtuple[:]newtuple = tuple(oldtuple)
  • 为什么还要复制它,如果它是不可变的,那么你确定引用不够好?
  • @wim 是的。我期待有人问这个。但是还有办法吗?
  • 不知道有没有办法。我想不出在内存中需要两个不同版本的(1, 2) 的用例。您要解决什么编程问题,导致您需要复制不可变对象?
  • 考虑“object = (1, [child_object])”的情况,我想修改child_object,使用后销毁修改(输出,什么的),同时保留原来的

标签: python types


【解决方案1】:

将空元组添加到它:

>>> a = (1, 2, 3)
>>> a is a+tuple()  
False

连接元组总是返回一个新的不同元组,即使结果相等。

【讨论】:

  • 这听起来像是一个实现细节而不是保证。
  • @DietrichEpp 确实如此,实际上tuple(list(a)) 也是如此(因为没有什么能阻止tuple.__new__,比如说,保持对它已经创建的所有元组的弱引用)。如果两个元组只包含不可变的元素,则可能没有绝对保证的方式来拥有两个不同但相等的元组。
  • 从命令行在 python 3.8.5 上运行相同的示例会得到输出 True。这不适用于新版本的语言吗?
  • 我在 Python 3.8.6 上得到了相同的结果。
【解决方案2】:

您正在寻找deepcopy

from copy import deepcopy

tup = (1, 2, 3, 4, 5)
put = deepcopy(tup)

诚然,这两个元组的 ID 将指向同一个地址。因为元组是不可变的,所以真的没有理由创建另一个完全相同的副本。但是,请注意,元组可以包含可变元素,并且 deepcopy/id 的行为与您预期的一样:

from copy import deepcopy
tup = (1, 2, [])
put = deepcopy(tup)
tup[2].append('hello')
print tup # (1, 2, ['hello'])
print put # (1, 2, [])

【讨论】:

  • 第一种情况的ID相同,第二种情况不同,元组设计得很好!
【解决方案3】:

试试这个:

tup = (1,2,3)
nt = tuple(list(tup))

而且我认为添加一个空元组要好得多。

【讨论】:

  • 添加一个空元组会好很多。
猜你喜欢
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2021-08-05
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多