下面是N叉树层次遍历的代码,为什么改变list时,也会将ans中对应的list改变?list = ans.get(depth)时,难道不是只是将ans中的list拷贝给了list吗
答案:
这是因为在Python中,list
是可变对象,它是通过引用进行传递的。当你执行list = ans.get(depth)
时,实际上是将ans
中的列表对象的引用赋值给了list
。所以,list
和ans
指向同一个列表对象,对list
的修改也会影响到ans
中的列表。
为了解决这个问题,你可以使用copy()
方法来创建一个新的列表对象,以避免修改list
影响到ans
。具体操作步骤如下:
import copy
加入到代码的开头处。list = copy.copy(ans.get(depth))
,这将创建一个ans
中列表对象的浅拷贝,即将列表的引用复制给了list
。list
的修改不会再影响到ans
中的列表。请注意,这种方法只适用于浅拷贝,即列表中的对象本身不会被复制。如果列表中包含可变对象(例如嵌套列表),并且你想要避免修改其中一个列表影响到另一个列表,可以使用copy.deepcopy()
方法进行深拷贝。
最后,请不要使用Python内置对象的名称(例如list
、dict
等)作为变量名,因为这会覆盖内置对象的功能。
ans是个成员变量,换言之,无论怎么递归,实际上只有一份ans对象。
ans是一个成员变量,你可以想象一下,ans里面如果是一个对象不是list,那么你ans.get()出来的对象,然后这个对象修改了属性,那么相当于就是修改了ans里面某个元素的属性。
你只有List newList = new ArrayList(ans.get(0)) 这样才算是把get出来的list复制到了newList里面,这个时候修改newList就不会改变ans里面的