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))