2015-02-09 71 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

相關問題