![](/img/trans.png)
[英]Why does slice assignment only work in-place for my function's list parameter if I slice it before?
[英]Why does my solution to reverse a list of characters in-place not work?
我正在做這個練習:
寫一個 function 來反轉一個字符串。 輸入字符串作為字符數組
s
給出。您必須通過使用額外的 O(1) memory 就地修改輸入數組來執行此操作。
我的解決方案不起作用:
def reverseString(s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
s = s[::-1]
正確答案:
def reverseString(s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
s[::] = s[::-1]
為什么我的解決方案不起作用?
表達式s[::-1]將創建一個新列表,其元素被反轉。
然后,
s[:] = s[::-1]
...導致將新列表復制到原始列表先前占用的地址空間中,而...
s = s[::-1]
將對反轉列表的引用分配給局部變量s 。
順便說一句,因為我不知道“O(1) 額外內存”是什么意思,所以值得注意的是,功能上正確的答案確實需要復制原始列表使用的 memory 而......
def reverseString(s):
i = 0
j = len(s) - 1
while i < j:
s[i], s[j] = s[j], s[i]
i += 1
j -= 1
...不是因為它在原位交換元素
您必須進行就地修改。
S[::] =
正在對s
的實際 memory 字節進行修改,而s = s[::-1]
指向變量名稱s
並且不進行任何修改。
重新分配 function 里面的列表不會改變原來的列表, s[:] =
or s[::] =
slice-assigns,替換之前列表中的內容
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.