前面有篇文章提过一次 http://ihipop.info/2010/10/1677.html 拿出来再复习一下
seq[start:stop:step]
start:同其它语言一样,从0开始。序列从左向右方向中,第一个值的索引为0,最后一个为-1
stop:切片操作符将取到该索引为止,注意:不包含该索引的值。
step:默认是一个接着一个切取,如果为2,则表示进行隔一取一操作。步长值为正时表示从左向右取,如果为负,则表示从右向左取。步长值不能为0
In [1]: data="123456789"
In [2]: data[:]
Out[2]: '123456789'
#截取全部,实际上属于python 的深拷贝(传值引用),见此
In [3]: data[4:]
Out[3]: '56789'
#从第5个字符截取到末尾
In [4]: data[-4:]
Out[4]: '6789'
#截取倒数4个字符
In [5]: data[:-4]
Out[5]: '12345'
#从开始截取到倒数第4个止
In [6]: data[4]
Out[6]: '5'
#截取第5个字符
In [7]: data[::-1]
Out[7]: '987654321'
#反转字符串序列
In [8]: data[0:5]
Out[8]: '12345'
# 截取前5个
Tips:关于Python的引用和拷贝(浅拷贝与深拷贝 )
首先看看字符串的情况
[python]In [1]: a="123"
In [2]: b=a
In [3]: id(a)
Out[3]: 16454368
In [4]: id(b)
Out[4]: 16454368
In [6]: a=a+str(4)
In [7]: a
Out[7]: '1234'
In [8]: b
Out[8]: '123'[/python]
再看看列表的情况
[python]In [1]: c=[1,2,3]
In [2]: d=c
In [3]: id(c)
Out[3]: 16399016
In [4]: id(d)
Out[4]: 16399016
#ID一样,是浅拷贝
In [5]: c
Out[5]: [1, 2, 3]
In [6]: d
Out[6]: [1, 2, 3]
In [7]: c.append(4)
In [8]: id(c)
Out[8]: 16399016
In [9]: id(d)
Out[9]: 16399016
#还是浅拷贝
In [10]: c
Out[10]: [1, 2, 3, 4]
In [11]: d
Out[11]: [1, 2, 3, 4]
[/python]
之所以会有这样的差别是因为a对象是不可变的(是个字符串类型)而c对象是可变的(一个列表)
再来换一种玩法
[python]In [1]: c = [4,5,6]
In [2]: e=[i for i in c]
In [3]: id(c)
Out[3]: 16399416
In [4]: id(e)
Out[4]: 16397176
In [5]: c
Out[5]: [4, 5, 6]
In [6]: e
Out[6]: [4, 5, 6]
In [7]: c.append(7)
In [8]: id(c)
Out[8]: 16399416
In [9]: id(e)
Out[9]: 16397176
In [10]: c
Out[10]: [4, 5, 6, 7]
In [11]: e
Out[11]: [4, 5, 6][/python]
难道遍历可以使得原本的浅拷贝(传址引用)变成深拷贝(传值引用)吗?
再换一种玩法
[python]
In [157]: a=[1,2,3,[4,5]]
In [158]: b=[i for i in a]
In [159]: a[-1].append(6)
In [160]: a.append(7)
In [161]: a
Out[161]: [1, 2, 3, [4, 5, 6], 7]
In [162]: b
Out[162]: [1, 2, 3, [4, 5, 6]]
[/python]
晕了没.哈哈~
使用深拷贝的方法
[python]In [164]: a=[1,2,3,[4,5]]
In [165]: b=copy.deepcopy(a)
In [166]: a[-1].append(6)
In [167]: a.append(7)
In [168]: a
Out[168]: [1, 2, 3, [4, 5, 6], 7]
In [169]: b
Out[169]: [1, 2, 3, [4, 5]][/python]
确信都明白了吗?
[python]In [182]: a=[1,2,3,[4,5]]
In [183]: b=a[:]
In [184]: a[-1].append(6)
In [185]: a.append(7)
In [186]: a
Out[186]: [1, 2, 3, [4, 5, 6], 7]
In [187]: b
Out[187]: [1, 2, 3, [4, 5, 6]][/python]
[python]In [21]: a=['1','2','3',['4','5']]
In [22]: b=[i[:] for i in a]
In [23]: a[-1].append('6')
In [24]: a.append('7')
In [25]: a
Out[25]: ['1', '2', '3', ['4', '5', '6'], '7']
In [26]: b
Out[26]: ['1', '2', '3', ['4', '5']]
[/python]
希望你没有晕!
看过。。。
其实深入对应也是一种引用,一种是直接拷贝吧