2011-04-19 43 views
19

我想知道,如果我這樣做Python是否對字符串進行切片引用?

a = "This could be a very large string..." 
b = a[:10] 

創建一個新的字符串或視圖/迭代器返回

+0

請注意,您可以對後者使用'itertools.islice'。 – delnan 2011-04-19 20:16:29

+2

當你運行它,並使用'id()'檢查對象標識時,你學到了什麼? – 2011-04-19 20:19:45

+7

@ S.Lott:一個視圖會有一個不同的id()到它的視圖對象。所以這實際上並沒有教你任何東西。做'type()'更有用。 – 2011-04-19 20:32:08

回答

32

Python does slice-by-copy,這意味着每次切片時(very trivial slices除外,例如a[:]),它會將所有數據複製到新的字符串對象中。

根據one of the developers,作出這樣的選擇是因爲

的〔切片按引用]的方法比較複雜,更難實現 並可能導致意外的行爲。

例如:

 
a = "a long string with 500,000 chars ..." 
b = a[0] 
del a 

隨着切片作爲拷貝設計串a被立即釋放。 切片參考設計將保留在內存中的500kB字符串,儘管 您只對第一個字符感興趣。

很顯然,如果你絕對需要一個視成一個字符串,你可以使用一個memoryview對象。

+0

@ BlueRaja-Danny-Pflughoeft其他可能的瑣碎切片有哪些? – sandeeps 2016-06-24 02:46:43

+0

@sandeeps單字節片,空片 – sshilovsky 2017-07-20 07:59:54

+0

如果我做'word ='python'單詞[2:3] ==單詞[2:-3]',我得到'true'。如果我比較id(word [2:3])和id(word [2:-3])',它們是一樣的。這是否意味着在切片時,python會爲相同的字符串做一些實習工作? – FaithReaper 2017-10-10 15:00:13

1

當分割字符串,它們返回字符串的一個新實例。字符串是不可變的對象。

+4

雖然這是真的,但這並沒有回答這個問題:他在問數據是否被複制。 – 2011-04-19 20:11:37

+1

這就是爲什麼您希望切片視圖不能複製的原因。不可變數據的一個常見用途是它很容易傳遞引用。所以我很好奇它爲什麼在Python中做了一個副本。 – sudo 2018-03-06 03:10:11