我想知道,如果我這樣做Python是否對字符串進行切片引用?
a = "This could be a very large string..."
b = a[:10]
創建一個新的字符串或視圖/迭代器返回
我想知道,如果我這樣做Python是否對字符串進行切片引用?
a = "This could be a very large string..."
b = a[:10]
創建一個新的字符串或視圖/迭代器返回
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
對象。
@ BlueRaja-Danny-Pflughoeft其他可能的瑣碎切片有哪些? – sandeeps 2016-06-24 02:46:43
@sandeeps單字節片,空片 – sshilovsky 2017-07-20 07:59:54
如果我做'word ='python'單詞[2:3] ==單詞[2:-3]',我得到'true'。如果我比較id(word [2:3])和id(word [2:-3])',它們是一樣的。這是否意味着在切片時,python會爲相同的字符串做一些實習工作? – FaithReaper 2017-10-10 15:00:13
當分割字符串,它們返回字符串的一個新實例。字符串是不可變的對象。
雖然這是真的,但這並沒有回答這個問題:他在問數據是否被複制。 – 2011-04-19 20:11:37
這就是爲什麼您希望切片視圖不能複製的原因。不可變數據的一個常見用途是它很容易傳遞引用。所以我很好奇它爲什麼在Python中做了一個副本。 – sudo 2018-03-06 03:10:11
請注意,您可以對後者使用'itertools.islice'。 – delnan 2011-04-19 20:16:29
當你運行它,並使用'id()'檢查對象標識時,你學到了什麼? – 2011-04-19 20:19:45
@ S.Lott:一個視圖會有一個不同的id()到它的視圖對象。所以這實際上並沒有教你任何東西。做'type()'更有用。 – 2011-04-19 20:32:08