列表对象的sort方法
(1). 在Python中,列表对象都有一个用于排序的方法:sort()。它会改变原始列表,而不是返回原始列表的副本:
a = [1,4,5,3]
a.sort()
其结果是:列表对象 a 变为 [1,3,4,5],即列表对象本身被修改了!(可以这样理解,在列表对象包含的方法 append,extend,insert,pop,remove,reverse,sort,都会直接修改原始列表,其调用方式也都是 “对象名.方法”,由于他们没有返回值【除开pop及返回值为None外】,不修改原始列表的话,那这些函数还有什么用呢?)
(2)排序,同时也保留原始副本
a = [1,4,5,3]
b = a[:] #比较高效的复制原始列表的方法
a.sort() #列表 a 的值被改变
其结果是:a的值为[1,3,4,5],b的值为[1,4,5,3]。
如果使用下述方法,则达不到原始目的:
a = [1,4,5,3]
b = a
a.sort()
其结果是:a的值为[1,3,4,5],b的值也为[1,3,4,5]。
可以看到,列表a,b的值被同时修改了!!!上述”b = a”代表的是b指向a,类似于C语言中的指针 — 而这也是我学C++之后感觉Python中比较操蛋的部分:一个对象同时又充当了类似于指针或引用的功能。
字典对象的clear方法
上述发生的“充当指针或引用”的情况同样发生在字典对象中,如下列:
x = {}
y = x
x[‘key’] = ‘value’
其结果是:x变为{‘key’:’value’},y的值也为{‘key’:’value’}。
继续:
x = {}
其结果是:x变为{},y的值仍为{‘key’:’value’}。
如果使用clear函数,则不一样了:
x = {}
y = x
x[‘key’] = ‘value’
其结果是:x变为{‘key’:’value’},y的值也为{‘key’:’value’}。
继续:
x.clear()
其结果是:x变为{},y的值也为{}。可以看到“y=x”相当于y指向了x,当x所在内存被清空时,其指向x的对象y的值也被清空了,而 “x = {}”,并没有清空内存,只是改变了对象x的值,所以y的值并没有改变。
诡异情况—字典对象的copy方法
都知道,字典对象的copy方法实现的是浅复制,即:
x = {‘username’ = ‘admin’, machines = [‘foo’,’bar’,’baz’]}
y = x.copy()
其结果是:x 的值为{‘username’ = ‘admin’, machines = [‘foo’,’bar’,’baz’]},y 的值也为{‘username’ = ‘admin’, machines = [‘foo’,’bar’,’baz’]}。
继续:
y[‘username’] = ‘mlh’
其结果是:x 的值为{‘username’ = ‘admin’, machines = [‘foo’,’bar’,’baz’]},y 的值为{‘username’ = ‘mlh’, machines = [‘foo’,’bar’,’baz’]},x 的值居然没有变化!!!
继续:
y[‘machines’].remove(‘bar’)
其结果是:x 的值为{‘username’ = ‘admin’, machines = [‘foo’,’baz’]},y 的值为{‘username’ = ‘mlh’, machines = [‘foo’,’baz’]},x 的值居然变化了!!! 完全懵逼。
有高手知道的,请赐教!!!