您的位置:首页 > 编程语言 > Python开发

Python 的set 类型及其copy方法

2015-09-24 17:54 736 查看
Python 的set 类型

用法

>>> set('you need python.')

{' ', 'd', 'e', 'o', 'h', 'p', '.', 'n', 'y', 'u', 't'}

>>> type(set('you need python.'))

<class 'set'>

>>> sorted(set('you need python.'))

[' ', '.', 'd', 'e', 'h', 'n', 'o', 'p', 't', 'u', 'y']

>>> type(sorted(set('you need python.')))

<class 'list'>

copy() 方法

set 有一个copy方法,定义是Return a new set with ashallow copy.

假设有一个set结构的变量sa, 调用set的copy方法并把结果赋给sb, 再调用set的pop方法从sb中取出一个值,类似于对栈的出栈操作。

sa=set('you need python.')

sb=sa.copy()

sb.pop()

之后再查看sa,sb的值,结果sa的值没有改变,而sb的值少了一个。说明对sb的改变并不会影响sa。

>>> sa

{'u', 'h', 'e', 'y', 'p', '.', ' ', 'n', 't', 'o', 'd'}

>>> sb

{'h', 'e', 'y', 'p', '.', ' ', 'n', 't', 'o', 'd'}

我的疑问是为什么官方文档中对copy方法的描述是 shallow copy?

在我的理解中,如果是shallowcopy的话, 并不会为sb 变量新分配一片内存,相当于把sb指向sa变量所在的内存区域。这样如果对sb做任何改动,实际上影响到了sa. 但上面的测试结果并非如此。

从Python 官方文档中找到如下描述:

The differencebetween
shallow and deep copying is only relevant forcompound objects (objects that contain other objects, like lists or classinstances):

A shallow copy constructs a new compound object and then (to the extent possible) inserts
references into it to the objects found in the original.
A deep copy constructs a new compound object and then, recursively, inserts
copies into it of the objects found in the original.

用一个嵌套的list进行测试:

a=[1,2,[3,4]]

b=a.copy()

b[2]=[5,6]

只对b的值做修改,完成后查看a,b的值,分别是

>>> a

[1, 2, [3, 4]]

>>> b

[1, 2, [5, 6]]

证明,仍然是deepcopy.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: