Python 是否有一个特别的原因可以避免使用clone=obj*1;“克隆”;物体?

Python 是否有一个特别的原因可以避免使用clone=obj*1;“克隆”;物体?,python,list,python-2.7,clone,Python,List,Python 2.7,Clone,在本文中,切片在制作项目副本方面比任何东西都要快 使用: list1 = ['foo','bar'] copy1 = list1 * 1 list1.pop() print 'list1: ' + list1 print 'copy1: ' + copy1 我得到: list1: ['foo'] copy1: ['foo', 'bar'] 有什么特别的理由不做这样的复制吗?别忘了你正在复制对同一对象的引用,这不是你(通常)所期望的: 如果要创建一个包含3个“1”列表的列表: >>

在本文中,切片在制作项目副本方面比任何东西都要快

使用:

list1 = ['foo','bar']
copy1 = list1 * 1
list1.pop()
print 'list1: ' + list1
print 'copy1: ' + copy1
我得到:

list1: ['foo']
copy1: ['foo', 'bar']

有什么特别的理由不做这样的复制吗?

别忘了你正在复制对同一对象的引用,这不是你(通常)所期望的:

如果要创建一个包含3个“1”列表的
列表

>>> lst = [[1]] * 3
>>> lst
[[1], [1], [1]]
现在对第一个项目执行一些操作:

>>> lst[0].append(2)
哎呀,这三个位置都是同一个对象:

>>> lst
[[1, 2], [1, 2], [1, 2]]
我希望
[[1,2],[1],[1]]
,但我想这是主观的,这就是为什么我不使用它。至少不能使用可变对象。

切片在复制项目方面比任何东西都快

您可以自己轻松地进行测试:

timeit.timeit('clone = lst * 1', 'lst = ["foo", "bar"]', number=10000000)
对我来说,我的时间是
0.8731180049981049

使用切片进行相同的测试:

timeit.timeit('clone = lst [:]', 'lst = ["foo", "bar"]', number=10000000)
给出的时间为:
0.9454964299984567

因此,
*
操作符实际上似乎更快。至于为什么人们用
[:]
来代替?它的作用更为明显


复制列表列表时会出现这种情况,请考虑:

>>> lst = [[1], [2]]
使用切片和
*1
复制仍允许修改原始列表

>>> copy1 = lst[:]
>>> copy1[0].append('x')
>>> lst # is affected by the above
[[1, 'x'], [2]]

>>> copy2 = lst * 1
>>> copy2[0].append('y')
>>> lst # is also affected by the above
[[1, 'x', 'y'], [2]]
但通过列表理解,序列可以被深度复制

>>> copy3 = [l[:] for l in lst]
>>> copy3[0].append('z')
>>> lst # unaffected
[[1, 'x', 'y'], [2]]

>>> copy4 = [l * 1 for l in lst]
>>> copy4[0].append('z')
>>> lst # also unaffected
[[1, 'x', 'y'], [2]]

为什么不
copy1=list(list1)
?除了可读性,我想不出还有什么。正如建议的那样^^^
list(x)
是最佳方式。另外,正如你所看到的,
x*n
很容易与
[x]*n
(完全不同)。啊,我明白了,我不知道列表的工作方式会有点不同。