为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牛魔王的故事 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,它将指向一个列表:

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

当您调用函数时myfunction(),该函数除其他外将创建一个名为的变量,该变量a将指向由list1以下内容指向的同一列表:

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

到目前为止,一切都很好。然后我们进入下面的循环:


while a:

    a.pop()

    a = new_a[:]

在它的第一行(a.pop()),您从列表中得到了一个项目。由于变量a和list1指向同一列表,因此您将看到相同的结果...

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

...如果不是循环(a = new_a[:])的下一行。在这一行中,您正在使a变量指向另一个 列表:

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

现在,您执行的每个操作a都将在此列表中,而该列表与无关list1。例如,您可以a.pop()在下一次迭代中执行以获取它:


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

然而,它使完全没有意义,因为该线a = new_a[:]将取代列表指出,a 再次另一种不同的列表

//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 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信