python里clear和copy_Python 中 sort、clear、copy 及 类似指针或引用的理解

列表对象的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 的值居然变化了!!! 完全懵逼。

有高手知道的,请赐教!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值