簡體   English   中英

Python函數不修改傳遞給它的列表

[英]Python function not modifying the list passed to it

  1. 函數x為什么不修改傳遞給它的列表的內容?
  2. 如何更改MWE,以便x 確實修改傳遞給它的列表的內容?
>>> def x(mylist):
...     mylist = [ x for x in mylist if x > 5 ]
... 
>>> foo = [1,2,3,4,5,6,7,8,9,10]
>>> x(foo)
>>> print foo
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

該函數不會修改x因為它正在將名稱mylist重新分配給新值。 替代方案將是令人驚訝的。

a = 1
b = a
b = 2
assert a == 1 # would you want a to be 2 here?

如果要替換內容,可以使用切片分配

def x(mylist):
    mylist[:] = [ x for x in mylist if x > 5 ]

python中的賦值運算符不會進行任何方法調用。 這是名稱重新綁定的機制。 但是,您可以實現__setitem__方法(如list ),該方法或多或少是運算符[]=

使用分片分配時,您使用一個分slice參數調用__setitem__ ,該參數說“用...替換列表的該分片”,其中...是=的右側

正如Ryan Haining所解釋的那樣, x正在重新分配該列表。 但是,它只能修改列表項:

def x(mylist):
    for i in reversed(mylist):
        if not i > 5:
            mylist.remove(i)

請注意,您應該以相反的順序遍歷列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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