質問: kotlinでobjectのlistを引数で他ファイルの関数に渡して、加工したものを戻すコードを作りました。 すると戻ってきたものは当然加工されたものでしたが、引数に渡した変数自体も変わっていました。 var a var b=application().fun(a) bにaが加工されて戻ってきたものが入るのはわかるのですが、aも変わってしまいます。これはなぜですか?
回答: 具体的な処理内容が書かれてないのでスーパー回答っぽいものをコメントします。 質問者さんは次の(1)のような雰囲気のことをしてしまったのかも知れません。 ``` fun main(args: Array) { run { // (1) Listの要素の破壊的な変更 val a = listOf(Label("a"), Label("b")) val b = addX1(a) println("a=$a, b=$b") // ==> a=[Label(ax), Label(bx)], b=[Label(ax), Label(bx)] } run { // (2) Listの要素の非破壊的な加工 val a = listOf(Label("a"), Label("b")) val b = addX2(a) println("a=$a, b=$b") // ==> a=[Label(a), Label(b)], b=[Label(ax), Label(bx)] } } class Label(var value: String) { override fun toString(): String = "Label($value)" } // (1) Listの要素の破壊的な変更 fun addX1(list: List): List { for (label in list) { label.value += "x" } return list } // (2) Listの要素の非破壊的な加工 fun addX2(list: List): List { return list.map { Label(it.value + "x") } } ``` 引数に渡したオブジェクトを変更せずに、加工した結果を得たい場合は(1)のような「破壊的な変更」ではなく(2)のように「加工した結果を新たに生成する」という考え方に変える必要があります。 閑話休題: この回答で質問者さんが納得できるかどうかは自分には自信ないです。質問者さんが「**どこまでわかっていてどこがわからないか**」をもうちょっと詳しく記述したり「具体的なコード」があればもっと要点をついたコメントができたかも知れません。 初心者の方にとって「何がわかっていて何がわかっていないのか」自体が自分自身ではっきりしてないことも多いでしょう。しかしながらあえて指摘すると「どうして元の値が変わってしまったのだろう?」と思ったときに「充分知識がない状態で日本語で質問するようなこと」をせずに * 簡単な例を書いてみて、どういう結果になるか多少なりとも試してみる * 試したコード、期待する結果、実際の結果を明記した**具体的な質問**をする としていればもっとずっと早く回答が得られたと思います。そういう努力をした方が結局は質問者さんのためにもなります。なんとなくですが質問者さんの学び方にちょっと中途半端さを感じます。もうちょっと * 教科書や解説やリファレンスなどの書き物をよく読む * それを自分自身で咀嚼する * 自分の理解を補強するためにコードを色々書いて試してみる といった「手と頭を動かす」基礎固めをするとよいのではないでしょうか? ところで、過去の質問でクローズされていないものが多い印象です。回答がついてないものについては「質問する前にすべきこと」「質問文の書き方」を見直してみたほうがよいのではないでしょうか?また質問コメントや回答がついているものについて「何も反応していない」ものもありますが、よくないと思います。ご自分の過去の質問を見直しコメントすべきはし、閉じるものは閉じるなど整理してみては?