sentence = "Hello"
print sentence
print sentence[:]
两种输出都是相同的,即“Hello
”
那么,何时以及为什么要使用/不使用[:]
?
谢谢! :)
sentence = "Hello"
print sentence
print sentence[:]
两种输出都是相同的,即“Hello
”
那么,何时以及为什么要使用/不使用[:]
?
谢谢! :)
[:] )的情况下进行切片基本上会创建原始序列的副本。
但是,您遇到了字符串的特殊情况。由于字符串是不可变的,因此复制字符串毫无意义。由于您将无法修改字符串的任何实例,因此无需在内存中拥有多个字符串。因此,使用 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是指两个对象完全相同。
>>> a = [1, 2, 3]
>>> b=a[:]
>>> id(b)
4387312200
>>> id(a)
4387379464
当您想要制作一个数组的深拷贝时。
>>> a='123'
>>> b=a[:]
>>> id(a)
4387372528
>>> id(b)
4387372528
但是由于字符串是不可变的,string[:] 和 string 本身没有区别。
附注:我看到大多数回答这个问题的人根本没有理解问题所在。
a = [[]]
; b = a[:]; a[0] is b[0]为True来确认这一点。要进行真正的深拷贝,请使用
copy.deepcopy`(https://docs.python.org/3.4/library/copy.html#copy.deepcopy)。 - lvca = []; 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你得到 Hello 作为输出的原因是你没有传递任何参数。
L[start:stop:step]
这里的L是你的变量,它保存了“Hello”。start表示字符串的初始位置,stop表示你想要以哪个位置结束字符串,而step表示你想要跳过多少个字符。
如需了解更多信息,请访问this。
看看是否解决了你的问题。