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

我需要随机擦除一些数字列表中的某个精确元素,提取一些随机索引并将其保存在称为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等,依此类推。


问题:该函数似乎在模块内正确地对其进行了修改(通过打印检查),但是,当我在模块外部(即“主”文件中)打印修改后的列表时,列表是未修改的。我哪里错了?


牛魔王的故事
浏览 153回答 3
3回答

侃侃尔雅

这行: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]变量不按值传递-您可以编辑可变值。

冉冉说

我不知道您要做什么,但是从您的摘录中您显然迷路了。您的代码没有多大意义,并且存在多个以上的问题。但是,您所问的问题-为什么列表没有完全更改?-似乎与此循环有关: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 再次为另一种不同的列表:那么,解决方案是什么?我不知道。如我所说,从您的代码中(至少对我而言)是不可能的。您需要更多地了解您要尝试做的事情,并在更多背景下向我们解释。

不负相思意

您发布的代码中没有任何功能。我怀疑问题是您没有返回新值。您的代码可能会执行以下操作:a = "foo"def func():    a = "bar" # uh-oh this not the same as the global afunc()此时,全局变量a是不变的,因为a局部func变量to是不相同的变量。您想做:a = "foo"def func():    return "bar"a = func()该代码将a在全局范围内分配给它,并对其进行更改。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python