3 回答
TA貢獻1801條經驗 獲得超16個贊
這行:
a=new_a[:]
a用新對象覆蓋變量。在函數或模塊之外,舊對象仍指向a(或在此處調用的對象)。嘗試:
new_a = [v for i, v in enumerate(a) if i not in aleaindex]
while a:
a.pop()
a[:] = new_a[:]
解釋
要查看此內容,請嘗試以下操作。
>>> a = [1,2,3,4]
>>> b = a
>>> print b
[1, 2, 3, 4]
>>> a[:] = [2,3]
>>> print b
[2, 3]
>>> a = [5]
>>> print b
[2, 3]
功能示例!
如果變量是可變的(并且是普通列表),則可以使用:
>>> def f(a):
... a[0] = 2
>>> b = [3]
>>> f(b)
>>> print b
[2]
變量不按值傳遞-您可以編輯可變值。
TA貢獻1877條經驗 獲得超1個贊
我不知道您要做什么,但是從您的摘錄中您顯然迷路了。您的代碼沒有多大意義,并且存在多個以上的問題。但是,您所問的問題-為什么列表沒有完全更改?-似乎與此循環有關:
while a: a.pop()
a = new_a[:]
假設我們以這種方式調用您的函數:
list1 = [1, 2, 3, 4, 5, 6, 7]
myfunction(N, other_parameters, list1, [], [])
將會發生的是,當您調用第一行時,您將獲得一個名為的變量list1,它將指向一個列表:

當您調用函數時myfunction(),該函數除其他外將創建一個名為的變量,該變量a將指向由list1以下內容指向的同一列表:

到目前為止,一切都很好。然后我們進入下面的循環:
while a:
a.pop()
a = new_a[:]
在它的第一行(a.pop()),您從列表中得到了一個項目。由于變量a和list1指向同一列表,因此您將看到相同的結果...

...如果不是循環(a = new_a[:])的下一行。在這一行中,您正在使a變量指向另一個 列表:

現在,您執行的每個操作a都將在此列表中,而該列表與無關list1。例如,您可以a.pop()在下一次迭代中執行以獲取它:

然而,它使完全沒有意義,因為該線a = new_a[:]將取代列表指出,a 再次為另一種不同的列表:

那么,解決方案是什么?我不知道。如我所說,從您的代碼中(至少對我而言)是不可能的。您需要更多地了解您要嘗試做的事情,并在更多背景下向我們解釋。
TA貢獻1777條經驗 獲得超10個贊
您發布的代碼中沒有任何功能。我懷疑問題是您沒有返回新值。
您的代碼可能會執行以下操作:
a = "foo"
def func():
a = "bar" # uh-oh this not the same as the global a
func()
此時,全局變量a是不變的,因為a局部func變量to是不相同的變量。
您想做:
a = "foo"
def func():
return "bar"
a = func()
該代碼將a在全局范圍內分配給它,并對其進行更改。
添加回答
舉報
