2015-02-09 70 views
-2
sentence = "Hello" 
print sentence 
print sentence[:] 

两个输出同样的事情,即Hello何时以及为什么要使用[:]在Python

所以,当以及为什么使用/不使用[:]

谢谢! :)

+4

在这里获取有关信息:http://stackoverflow.com/questions/509211/explain-pythons-slice-notation – Nobi 2015-02-09 06:59:11

+0

从你身边努力,似乎你甚至没有研究这是什么。 – 2015-02-09 07:18:21

+0

@UlrichEckhardt我真的很抱歉...但这是我在stackoverflow中的第一篇文章...我不知道它叫做切片符号,我在Google搜索中搜索[:]时遇到问题。 :) – 2015-02-09 14:47:58

回答

0

你的理由为什么你作为输出得到你好,你是没有传递任何参数。

L[start:stop:step] 

这里L是你的变量,它包含Hello。 start表示字符串的起始位置,stop表示要结束字符串的位置,& step表示要跳过的字符数。

有关此主题的更多信息,请访问this

看到的,如果您的问题解决。

2

由于Nobi在评论中指出,已经有question regarding Python's slicing notation。正如对该问题的回答所述,无开始和结束值的切片([:])基本上创建了原始序列的副本。

但是,你已经打了一个字符串的特例。由于字符串是不可变的,所以创建一个字符串的副本是没有意义的。由于您无法修改字符串的任何实例,因此不需要在内存中有多个实例。所以,基本上,与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 

标识是相同的,这意味着两者都是相同的确切对象。

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

当你想做一个数组的深层副本。

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

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

P.S.我看到大部分回答这个问题的人都不明白这个问题是什么。

+1

这使得一个*浅*副本的列表,而不是一个深层复制。你可以通过注意到'a = [[]]'; b = a [:]; a [0]是b [0]'给出True。要执行真正的深层复制,请使用'copy.deepcopy'](https://docs.python.org/3.4/library/copy.html#copy.deepcopy)。 – lvc 2015-02-09 07:22:59

+1

...不,不,他们没有。 'a = []; b = []; a是b'是假的。相反,你可以把你想要的任何东西放到内部列表中,并得到相同的结果 - “mylist [:]'不会*制作列表中任何对象的副本。尝试'a = [['a','b','c','d']]; b = a [:];打印(a [0]是b [0]);一个[0] .append( 'E');打印(B [0])'。 – lvc 2015-02-09 07:37:19

相关问题