[英]Why can't I change a list in a method?
我有一個不包含循環的方法。 我將列表傳遞給該方法。 我為此代碼段分配了一個新值:
def do_paging(pageable_list):
pageable_list = pageable_list[start:end]
在調用代碼中:
do_paging(source_list)
但看起來source_list
似乎沒有更改。 如果我回到pageable_list
從do_paging()
一切都很好。 數組參數是不可變的嗎?
我開始返回該值,因為它更好。 但是我很驚訝,想知道發生了什么。
編輯-我怎么可能已經對Python編程了一年了,還不知道呢!
切片正在創建一個新列表:
>>> a = [1,2,3]
>>> b = a[1:2]
>>> a is b
False
您不是要更改原始列表:
>>> a
[1, 2, 3]
此外,你永遠不會做與您指定的名稱列表中的任何pageable_list
你到do_paging
功能。
因此,問題是a)您沒有修改原始列表和/或b)您沒有從函數中返回任何內容。 使代碼工作的一種方法是創建切片並將名稱pageable_list
重新分配給函數的返回值,即:
def do_paging(pageable_list, start, end):
return pageable_list[start:end]
pageable_list = do_paging(pageable_list, start, end)
該函數可能還應該帶有start
和end
參數,在全局空間中查找這些參數是很丑陋的。
但是,如果您只需要對函數進行切片,則該函數並不是真正有用的,您可以使用該行
pageable_list = pageable_list[start:end]
當我最近從Quantopian查看代碼並且從未使用過該代碼時,我在下面注意到了該方法。 根據@Steven_Rumbalski的評論,這會將切片分配回輸入變量pageable_list
。
def do_paging(pageable_list, start, end):
pageable_list[:] = pageable_list[start:end]
a = [1, 2, 3, 4, 5]
do_paging(a, 2, 4)
>>> a
[3, 4]
您沒有更改“列表”。 您正在將新值分配給局部變量。
更改列表本身將起作用:
def do_paging(pageable_list):
pageable_list.pop()
但是變量pageable_list
只是一個局部變量,為它分配一些新值不會修改以前分配給它的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.