sorted函数返回一个新的列表就安全了吗?

arr=[[1,2,3],[4,2,3],[5,2,3]]
x2=sorted(arr)
print 'sorted',x2

print '-'*20
for ar in arr:
   ar.append('trap')
print 'arr',arr
print 'sorted',x2

结果:

>>> 
sorted [[1, 2, 3], [4, 2, 3], [5, 2, 3]]
--------------------
arr [[1, 2, 3, 'trap'], [4, 2, 3, 'trap'], [5, 2, 3, 'trap']]
sorted [[1, 2, 3, 'trap'], [4, 2, 3, 'trap'], [5, 2, 3, 'trap']]
>>> 


可见,当sorted排序对象A的元素是可变对象(如列表)时,即使返回的是一个新的对象B,即id(A)和id(B)不相同,B的元素仍然是直接引用A的元素的.

解决方案:对sorted进行包装:

def safesorted(arr,*nkw,**kw):
   from copy import deepcopy
   return deepcopy(sorted(arr,*nkw,**kw))

 

posted @ 2013-10-23 12:54  LisPythoniC  阅读(236)  评论(0编辑  收藏  举报