首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

不是说切片可以避免浅拷贝的吗?该如何处理

2013-07-09 
不是说切片可以避免浅拷贝的吗???下面这种方法切片了啊,为什么还是浅拷贝啊???请大侠指教Python多维数组浅

不是说切片可以避免浅拷贝的吗???
下面这种方法切片了啊,为什么还是浅拷贝啊???请大侠指教
不是说切片可以避免浅拷贝的吗?该如何处理 Python 多维数组 浅拷贝
[解决办法]
[[0]*4这个地方你都没保存,当然看不出来l是引用还是拷贝了
另外创建后的对象是否为原对象的引用或者是拷贝,可以用内置的id()函数查看,下面演示了切片是一个拷贝,而非引用


a = range(5)
print a,id(a)

l = a[:]
print l,id(l)
[解决办法]
浅拷贝是指切片的元素和原来列表中的元素一样(只拷贝地一层),但列表是新的列表。


In [322]: l = [0, pow(2, 100), '0'*1000, set()]

In [323]: l2 = l[:]

In [324]: map(id, l)
Out[324]: [14391312, 38078688, 37056256, 30727656]

In [325]: map(id, l2)
Out[325]: [14391312, 38078688, 37056256, 30727656]

In [326]: print id(l), id(l2)
38131040 38255648


另外,你的代码中展示的问题(l的三个元素是同一个对象)是因为"*3"引起的。[whatever]*3都是三份whatever,不管[whatever]这个列表是怎么来的(直接构造或取另一个列表的切片)。

热点排行