為什么陣列中需要 [:]。我知道使用 [:] 切片會創建一個副本,但為什么這里需要副本?我還嘗試使用無效的臨時變數創建副本。這是針對陣列旋轉問題。
class Solution:
def rotate(self, nums, k):
k=k%len(nums)
g = len(nums) -k
nums[:] = nums[g:] nums[:g]
A=Solution()
MyList=[1,2,3,4]
A.rotate(MyList,2)
assert (MyList == [3, 4, 1, 2])
uj5u.com熱心網友回復:
分配給 之后MyList,將創建串列[1,2,3,4]并且 MyList 包含對它的參考。
當您呼叫作為引數傳入的函式rotate()時,nums 包含對所參考的同一串列的參考。MyListnums[1,2,3,4]MyList
如果您想在rotate()函式中修改該串列,您可以執行類似nums[0] = 99or nums[1:2] = [33,66]or的操作nums[:] = nums[g:] nums[:g],這些操作將作用于在原始分配中創建的相同串列 to MyList。
但是,如果您改為nums = nums[g:] nums[:g]在函式內部撰寫rotate(),這將簡單地更新nums為現在對全新串列的參考(對and的 操作的結果),該串列與參考的物件完全不同。nums[g:]nums[:g]MyList
這就是[:]在賦值左側需要語法的原因nums[:]。
uj5u.com熱心網友回復:
原因是,在函式定義內部,“nums”是一個區域變數,它參考作為函式引數傳入的任何物件。重新分配該變數不會更改傳入的物件,只會更改參考。
什么代碼:
templist = nums[g:] nums[:g]
nums = templist
所做的是分配旋轉內部的區域變數“nums”以指向臨時串列物件。傳入的物件不變。
在作業代碼的情況下, [:] 不會創建串列的副本。相反,它是切片符號,告訴“num”物件回圈遍歷其值并將它們分配給 = 符號右側給出的值。它主要相當于:
templist = nums[g:] nums[:g]
for i in range(len(templist)):
nums[i] = templist[i]
uj5u.com熱心網友回復:
好吧,答案是:你沒有!nums[:] = ... 表示您將 nums 中的所有內容分配給某物。第五行是一樣的
nums = nums[g:] nums[:g]
別忘了寫
return nums
在函式的末尾回傳 nums。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469091.html
上一篇:使用for回圈查找陣列中的元素
下一篇:在Java陣列中添加超過1個東西
