复习一下Python的字符串切片(截取)操作 AND Python的深浅拷贝(传值/传址)

前面有篇文章提过一次 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]

希望你没有晕!
:-x

Author Info :
  • From:复习一下Python的字符串切片(截取)操作 AND Python的深浅拷贝(传值/传址)
  • URL:https://blog.ihipop.com/2011/02/2106.html
  • Please Reserve This Link,Thanks!
  • 《复习一下Python的字符串切片(截取)操作 AND Python的深浅拷贝(传值/传址)》上有2条评论

    发表回复

    您的电子邮箱地址不会被公开。 必填项已用 * 标注