List<Int>는 읽기 전용 뷰예요. 스냅숏이 아니에요. 그 참조로 어떤 연산을 호출할 수 있는지 알려 줄 뿐, 뒤에 있는 컬렉션이 그대로 남는다고 약속하지는 않아요.
val owned = mutableListOf(2, 4)를 예로 들어 볼게요. 호출자가 owned를 List<Int>를 받는 함수에 넘기고, 나중에 6을 추가해요. 함수가 같은 객체를 쥐고 있었다면 이제 6도 보여요. val이 고정한 건 owned가 가진 참조예요. 내용은 처음부터 고정된 적이 없어요.
결국 함수가 무엇을 필요로 하느냐에 달렸어요. 넘겨받은 순간의 값이 필요하다면 정해진 지점에서 복사하고, 그 복사본이 나중에 바뀌지 않게 막아야 해요. 이 경계는 시그니처나 문서에 명시해 두겠어요. 호출자의 현재 리스트를 읽는 게 목적이라면 공유 객체를 그대로 들고 있어도 괜찮고, 복사해 봐야 얻는 게 없어요.