在Python中何时以及为什么要使用[:]?

3
sentence = "Hello"
print sentence
print sentence[:]

两种输出都是相同的,即“Hello

那么,何时以及为什么要使用/不使用[:]

谢谢! :)


4
获取有关此内容的信息,请访问:https://dev59.com/D3RB5IYBdhLWcg3wyqOo - Nobi
你好像并没有付出任何努力,似乎你甚至都没研究这个做了什么。 - Ulrich Eckhardt
2
@UlrichEckhardt 我真的很抱歉...但这是我在stackoverflow上的第一篇帖子...我不知道它被称为切片符号,我在谷歌搜索中确实遇到了问题。 :) - Desmond Yeoh
3个回答

8
作为对评论的回应,如Nobi所指出的,关于Python切片符号的问题已经有了一个问题。如那个问题的答案所述,在没有开始和结束值( [:] )的情况下进行切片基本上会创建原始序列的副本。
但是,您遇到了字符串的特殊情况。由于字符串是不可变的,因此复制字符串毫无意义。由于您将无法修改字符串的任何实例,因此无需在内存中拥有多个字符串。因此,使用 s [:] (其中 s 是一个字符串)不会创建字符串的副本;该语句返回由 s 引用的完全相同的字符串。使用 id()(对象标识)函数可以轻松查看这一点:
>>> l1 = [1, 2, 3]
>>> l2 = l1[:]
>>> id(l1)
3075103852L
>>> id(l2)
3072580172L

身份不同。但是,使用字符串:

>>> s1 = "Hello"
>>> s2 = s1[:]
>>> id(s1)
3072585984L
>>> id(s2)
3072585984L

Identity是指两个对象完全相同。


1
>>> a = [1, 2, 3]
>>> b=a[:]
>>> id(b)
4387312200
>>> id(a)
4387379464

当您想要制作一个数组的深拷贝时。

>>> a='123'
>>> b=a[:]
>>> id(a)
4387372528
>>> id(b)
4387372528

但是由于字符串是不可变的,string[:] 和 string 本身没有区别。

附注:我看到大多数回答这个问题的人根本没有理解问题所在。


2
这将创建一个列表的浅拷贝,而不是深拷贝。你可以通过注意到a = [[]]; b = a[:]; a[0] is b[0]为True来确认这一点。要进行真正的深拷贝,请使用copy.deepcopy`(https://docs.python.org/3.4/library/copy.html#copy.deepcopy)。 - lvc
1
不,它们并不相等。a = []; b = []; a is b 的结果是 False。反之,你可以将任何你想要的东西放入内部列表中,并得到相同的结果 - mylist[:] 不会复制列表中的任何对象。试试 a = [['a', 'b', 'c', 'd']]; b = a[:]; print(a[0] is b[0]); a[0].append('e'); print(b[0]) - lvc

0

你得到 Hello 作为输出的原因是你没有传递任何参数。

L[start:stop:step]

这里的L是你的变量,它保存了“Hello”。start表示字符串的初始位置,stop表示你想要以哪个位置结束字符串,而step表示你想要跳过多少个字符。

如需了解更多信息,请访问this

看看是否解决了你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接