我們有時會不經意間寫下如下代碼:
def update_indices(indices):
indices = [] # 像在更新indices前先將其置空
for i in range(10):
indices.append(i)
indices = [0, 1, 2]
update_indices(indices)
print(indices)
如上所示,我們有一個元素為indices的串列,想通過函式update_indices對其進行更新,不過有點特殊的是,我們想在update_indices中先將串列置空,然后再插入元素0, 1,..., 9,不過,代碼運行的結果會出乎我們意料:
[0, 1, 2]
誒~并不是我們想象的[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],而是根本就沒有變,變數indices還是和呼叫函式update_indices前一樣,難道是因為函式引數傳的拷貝嗎?肯定不會,因為我們知道Python中對于串列統一傳的是參考,那是什么導致我們對引數的修改失效了呢?
答案就是函式第一行的
indices = []
這一行看似是將函式引數indices置為空,其實是重新定義了一個函式中的區域變數indices,這個區域變數indices將函式的引數indices屏蔽掉了,而我們之后在函式中對indices的操作,其實都是在更改函式的區域變數,當然不能影響到做為函式引數的indices了,
解決這個問題的途徑之一是:對于需要對引數重置的函式,我們最好直接傳回傳值,避免引起歧義:
def update_indices():
indices = [] # 像在更新indices前先將其置空
for i in range(10):
indices.append(i)
return indices
indices = [0, 1, 2]
indices = update_indices()
print(indices)
這樣,結果就如我們預期了:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
數學是符號的藝術,音樂是上界的語言,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423296.html
標籤:其他
上一篇:STC89C52引腳圖(彩色)
