如何在Python中复制像tuple这样的不可变对象?

18 python types

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

Mak*_*oto 29

你在找deepcopy.

from copy import deepcopy

tup = (1, 2, 3, 4, 5)
put = deepcopy(tup)
Run Code Online (Sandbox Code Playgroud)

不可否认,这两个元组的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, [])
Run Code Online (Sandbox Code Playgroud)

  • 对于第一种情况,Ids是相同的,对于第二种情况,它们是不同的,元组设计得很好! (3认同)

lvc*_*lvc 18

添加空元组:

>>> a = (1, 2, 3)
>>> a is a+tuple()  
False
Run Code Online (Sandbox Code Playgroud)

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

  • 这听起来像是一个实现细节而不是保证. (6认同)
  • 我在 Python 3.8.6 上得到了相同的结果。 (3认同)
  • @DietrichEpp这是真的,实际上`tuple(list(a))`同样是(因为没有什么能阻止`tuple .__ new__`,比如说,保持对它已经创建的所有元组的弱引用).如果它们只包含不可变元素,那么可能*没有*绝对保证的方式有两个不同但相等的元组. (2认同)
  • 从命令行在 python 3.8.5 上运行相同的示例会给出输出“True”。这不适用于该语言的较新版本吗? (2认同)

Wik*_*hao 7

尝试这个:

tup = (1,2,3)
nt = tuple(list(tup))
Run Code Online (Sandbox Code Playgroud)

  • @CecilCurry 为什么它是二次的?当然是线性的。 (2认同)