python 序列与深浅拷贝

2018-10-06 22:07:11   最后更新: 2018-10-07 13:38:37   访问数量:135




上一篇日志中,我们介绍了 python 的对象类型

python 对象

本文我们来介绍 python 的几个序列类型:

  1. 字符串 -- "abc"
  2. 列表 -- ["a", "b", "c"]
  3. 元组 -- ("a", "b", "c")

 

这些容器类型都是由一些成员共同组成的一个序列整体,所以统称为序列

列表和字符串、元组最大的区别为列表可变,字符串和元祖不可变

 

一般来说,标准类型操作符适用于所有的序列类型,除此之外,这些序列类型还支持以下操作

 

序列的加法 -- 连接操作符

序列的加法用来连接两个序列,但是必须是两个相同类型的序列才可以进行连接操作

>>> seq0 = ["a", "b", "c"] >>> seq1 = ["d", "e", "f"] >>> seq0 + seq1 ['a', 'b', 'c', 'd', 'e', 'f']

 

 

序列的乘法

序列的乘法用来让序列重复 N 次

>>> seq0*2 ['a', 'b', 'c', 'a', 'b', 'c']

 

 

成员关系操作符 -- in & not in

成员关系操作符使用来判断一个元素是否属于一个序列的

对于字符串类型来说,可以判断字符是否属于这个字符串

>>> 'a' in seq0 True >>> 'a' not in seq0 False

 

 

切片操作符 -- [] & [:] & [::]

切片操作符可以让你轻松的获取序列的子序列,他返回一个包含指定规则筛选出的序列结果

 

  • 索引操作符 -- []

通过下标获取元素

>>> seq = ["a", "b", "c", "d", "e"] >>> seq[1] 'b' >>> str = "abcde" >>> str[1] 'b'

 

 

 

  • 起始到终止的筛选 -- seq[starting_index:ending_index]

通过这种方式我们可以得到从起始索引到结束索引(不包括结束索引对应的元素)之间的一"片"元素

起始索引和结束索引都是可选的,如果没有提供或者用 None 作为索引值,切片操作会从序列的最开始处开始,或者直到序列的最末尾结束

索引值也可以是负数,这表示从末尾开始截取

>>> seq2 = seq0 + seq1 >>> seq2[:3] ['a', 'b', 'c'] >>> seq2[3:] ['d', 'e', 'f'] >>> seq2[-3: -1] ['d', 'e']

 

 

  • 步长索引切片 -- seq[starting_index:ending_index:step]

python 还允许通过步长来进行切片,它意味着“起始到终止切片后的集合中每 step 个数取一个”

>>> seq2[::-1] # 翻转操作 ['f', 'e', 'd', 'c', 'b', 'a'] >>> seq2[::2] # 隔一个取一个 ['a', 'c', 'e']

 

 

  • 列表分片赋值

这个特性让你有了批量改变列表中某些指定元素的能力

# 赋值 >>> l=range(10) >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> l[:3] = 'abcdefg' >>> l ['a', 'b', 'c', 'd', 'e', 'f', 'g', 3, 4, 5, 6, 7, 8, 9] >>> # 插入 >>> l = range(10) >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> l[2:2] = [u'在第三个元素插入'] # 插入数据 >>> l [0, 1, u'\u5728\u7b2c\u4e09\u4e2a\u5143\u7d20\u63d2\u5165', 2, 3, 4, 5, 6, 7, 8, 9] >>> # 删除 >>> l = range(10) >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> l[1:4] = ''  #等价于del l[1:4] >>> l [0, 4, 5, 6, 7, 8, 9]

 

 

  • 例子 -- trim 函数
def trim(str): while str[:1]==' ': str = str[1:] while str[-1:] == ' ': str = str[:-2] return str

 

 

运行:

trim(" a b c ")

 

输出了:

a b c

 

赋值

我们知道,在 python 中,直接赋值是传递对象的引用,将 a 赋值给 b,二者的任何修改都是同步的,因为他们操作的是同一个对象

alist=[1,2,3,["a","b"]] >>> b=alist >>> print b [1, 2, 3, ['a', 'b']] >>> alist.append(5) >>> print alist;print b [1, 2, 3, ['a', 'b'], 5] [1, 2, 3, ['a', 'b'], 5]

 

 

浅拷贝 -- copy.copy

copy 包提供了浅拷贝和深拷贝的特性

浅拷贝是将原始对象的所有数据都拷贝一份,但是原始数据中的子对象却并不进行拷贝,只是拷贝子对象的引用

这样,虽然修改原始对象中任何普通元素都不会影响到拷贝出来的对象,但是对原始对象中子对象的修改就会同步到拷贝对象中

>>> import copy >>> alist = [1,2,3,["a","b"]] >>> c = copy.copy(alist) >>> c [1, 2, 3, ['a', 'b']] >>> alist[2] = 5 >>> alist [1, 2, 5, ['a', 'b']] >>> c [1, 2, 3, ['a', 'b']] >>> alist[3].append('c') >>> alist [1, 2, 5, ['a', 'b', 'c']] >>> c [1, 2, 3, ['a', 'b', 'c']]

 

 

深拷贝 -- copy.deepcopy

与浅拷贝不同,深拷贝会递归拷贝对象及其所有的子对象

>>> import copy >>> alist = [1,2,3,["a","b"]] >>> c = copy.deepcopy(alist) >>> alist[3].append("c") >>> c [1, 2, 3, ['a', 'b']] >>> alist [1, 2, 3, ['a', 'b', 'c']]

 

 






读书笔记      技术帖      python      python核心编程      string      copy      深拷贝      浅拷贝      序列     


京ICP备15018585号