簡體   English   中英

為什么我不能在方法中更改列表?

[英]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_listdo_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)

該函數可能還應該帶有startend參數,在全局空間中查找這些參數是很丑陋的。

但是,如果您只需要對函數進行切片,則該函數並不是真正有用的,您可以使用該行

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM