正如另一个答案所说,这样做:
res.add(r)
r在列表中添加对同一对象的引用。实际上,这里发生的是:
r
指清单- 该引用作为参数传递给
add
- 对列表的引用存储在内部
res
但是请注意,两者
r和内部的引用
res都指向 同一个对象
当您执行此 *** 作时,
temp会发生以下情况:
- 创建一个新列表,并用引用原始列表中所有数据的副本
r
。 - 此列表已分配给
temp
- 对新列表的引用作为参数传递给
add
- 对列表的引用存储在内部
res
因此,现在
r指向列表的原始副本,而内部引用
res指向列表的新副本。它们是两个不同的对象。
为什么这很重要?
基本上,您的递归步骤向中添加一个元素
r,
find再次调用,然后从中删除一个元素
r。
r和
res中的引用沿递归传递,这意味着这两个相同的对象沿递归传递。
但是由于从递归中返回后,您主动从中删除了一个对象
r,这意味着最后,当您完全向上移动时,内部将不再有元素
r。
由于存储在内部的引用
res指向的 是同一对象
r,而不是其副本,因此,当您使用删除项目时
r.remove(),该对象将变为空。但这是我们从内部引用的对象
res。因此,在递归结束时,它将为空。
认为它是安全的。A人用金钱装满保险柜。然后,他将B人的第二把钥匙交给保险箱。然后,他用原来的钥匙进入,取出了所有的钱。当B来打开保险柜时,它是空的!
复制此列表等效于A给予B自己的钱以放入自己的保险箱。A可以从自己的保险箱中取出任意多的钱,而且不会改变B保险箱中的钱数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)