你好,我想知道为什么我的程序只改变了editTransactionList,却改变了selectedDataEdited List?
var editTransactionList: MutableList<Transaction>? = mutableListOf()
var selectedDataEdited: List<Transaction>? = listOf()
editTransactionList = listTest as MutableList<Transaction>
selectedDataEdited = listTest
var position = 0
println("edit $editTransactionList")
println("select $selectedDataEdited")
editTransactionList.get(position).apply {
amount = 2000
name = "K"
}
println("edit $editTransactionList")
println("select $selectedDataEdited")
editTransactionList.get(position).apply {
amount = 3000
name = "Z"
}
println("edit $editTransactionList")
println("select $selectedDataEdited")
输出为
edit [Transaction(amount=1000, name=T, test=1)]
select [Transaction(amount=1000, name=T, test=1)]
edit [Transaction(amount=2000, name=K, test=1)]
select [Transaction(amount=2000, name=K, test=1)]
edit [Transaction(amount=3000, name=Z, test=1)]
select [Transaction(amount=3000, name=Z, test=1)]
4条答案
按热度按时间pqwbnv8z1#
变量基本上是引用。当你在变量中存储一个对象时,你实际上是说“当使用这个变量时,请引用这个对象”。因此,如果你将同一个对象“存储”到两个不同的变量中,它们中的每一个仍然引用同一个对象。使用第一个变量获取对象,对它进行更改,然后访问第二个变量,仍然会得到更改后的对象。
您需要复制列表以防止不必要的行为。但请记住,您可能需要一个深度副本。例如,简单地调用
toList()
只会产生一个浅拷贝,这意味着即使它将是一个不同的列表,其中的对象仍然会引用原始列表。如果不知道
Transaction
是什么样子的话,很难判断什么是可行的。如果Transaction
是一个数据类,那么selectedDataEdited = listTest.map { it.copy() }
就可以工作。参见此示例https://pl.kotl.in/Q_o8pYXVs9q78igpj2#
如果
selectedDataEdited = listTest.map { it.copy() }
不工作,请尝试以下代码:sd2nnvve3#
为什么当我改变一个列表时,它也意外地改变了另一个列表
因为你没有“另一个”名单。你只有一个名单。
当执行
selectedDataEdited = listTest
时,将第二个引用分配给同一个列表。如果需要两个单独的列表,则必须创建它们,可能是通过克隆原始列表。arknldoa4#
使用
toMutableList
代替as MutableList
:它将复制你的列表,而不是传递对同一列表的引用。