亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在主文件中看到功能修改后的列表不更改?

為什么在主文件中看到功能修改后的列表不更改?

牛魔王的故事 2021-03-20 15:11:08
我需要隨機擦除一些數字列表中的某個精確元素,提取一些隨機索引并將其保存在稱為aleaindex的集合中(完成,由于某些SO用戶的幫助,它可以正常工作)。現在,我想用新的,最終較短的新列表newa,newb等替換舊列表a,b等。這是函數:def myfunction(N, other_parameters, a, b, c):    ...    while (...):        aleaindex.add(random.randint(..., ...))    ...    new_a = [v for i, v in enumerate(a) if i not in aleaindex]    while a: a.pop()        a = new_a[:]    ...對于其他列表b,c等,依此類推。問題:該函數似乎在模塊內正確地對其進行了修改(通過打印檢查),但是,當我在模塊外部(即“主”文件中)打印修改后的列表時,列表是未修改的。我哪里錯了?
查看完整描述

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]

變量不按值傳遞-您可以編輯可變值。


查看完整回答
反對 回復 2021-03-29
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

我不知道您要做什么,但是從您的摘錄中您顯然迷路了。您的代碼沒有多大意義,并且存在多個以上的問題。但是,您所問的問題-為什么列表沒有完全更改?-似乎與此循環有關:


while a: a.pop()

    a = new_a[:]

假設我們以這種方式調用您的函數:


list1 = [1, 2, 3, 4, 5, 6, 7]

myfunction(N, other_parameters, list1, [], [])

將會發生的是,當您調用第一行時,您將獲得一個名為的變量list1,它將指向一個列表:

http://img1.sycdn.imooc.com//6061912d00010e7d05510109.jpg

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

http://img1.sycdn.imooc.com//6061913b0001d0d605550198.jpg

到目前為止,一切都很好。然后我們進入下面的循環:


while a:

    a.pop()

    a = new_a[:]

在它的第一行(a.pop()),您從列表中得到了一個項目。由于變量a和list1指向同一列表,因此您將看到相同的結果...

http://img1.sycdn.imooc.com//6061914b000178b505530197.jpg

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

http://img1.sycdn.imooc.com//606191580001cfd605540201.jpg

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


http://img1.sycdn.imooc.com//606191640001729205540200.jpg

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

http://img1.sycdn.imooc.com//6061916f0001fa8405520314.jpg

那么,解決方案是什么?我不知道。如我所說,從您的代碼中(至少對我而言)是不可能的。您需要更多地了解您要嘗試做的事情,并在更多背景下向我們解釋。


查看完整回答
反對 回復 2021-03-29
?
不負相思意

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在全局范圍內分配給它,并對其進行更改。


查看完整回答
反對 回復 2021-03-29
  • 3 回答
  • 0 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號