Tingkah laku pelik tambahan dalam Go

王林
Lepaskan: 2024-02-02 14:13:26
ke hadapan
1024 orang telah melayarinya

Go 中追加的奇怪行为

Kandungan soalan

Saya cuba menyelesaikan masalah subset pada LeetCode menggunakan Go. Saya datang dengan penyelesaian berikut:

func subsets(nums []int) [][]int {
    sol := make([][]int,0)
    temp:= make([]int,0)

    var backtrack func(idx int)
    backtrack = func(idx int) {
        sol = append(sol, temp)
        fmt.Println(temp, append([]int{},temp...))

        if idx == len(nums) {
            return
        }

        for i:= idx; i<len(nums);i++{
            temp = append(temp,nums[i])
            backtrack(i+1)
            temp = temp[:len(temp)-1]
        }

    }
    backtrack(0)
    return sol

}
Salin selepas log masuk

Namun, penyelesaian ini tidak betul. Saya perasan bahawa saya perlu menggunakan append(sol,append([]int{},temp...)) dan bukannya sol=append(sol,temp).

Walaupun pernyataan fmt.Println(temp,append([]int{}, temp...)) menjana output yang sama untuk temp dan append([]int{}, temp...), gunakan append([ ]int {}, temp...) sebenarnya berfungsi. Bolehkah seseorang menerangkan perbezaan antara temp dan append([]int{}, temp...) dalam kes ini? Mengapakah versi yang diperbetulkan berfungsi tetapi versi awal tidak?

Dijangkakan bahawa temp dan append([]int{},temp...) adalah samatempappend([]int{},temp...) 相同


正确答案


sol =append(sol, temp) 的问题是您将切片 temp 添加到 sol

Jawapan yang betul

Masalah dengan sol =append(sol, temp) ialah anda menambah kepingan temp pada sol dan bukannya item "di dalam" kepingan. Seperti yang dinyatakan dalam

Slice internal blog posttemp 在每次迭代中重用,因此 temp 切片下的数组内容将被覆盖,并且您之前添加到 sol 的切片内的值也将被覆盖已修改(因为切片下的数组已修改)。这就是为什么您最终得到错误结果的原因,即使您的 fmt.Println 语句显示在附加之前, temp, slice ialah "hanya" penunjuk kepada tatasusunan, panjang dan kapasitinya.

Jadi, dalam kes anda, kerana append([]int{}, temp...) mempunyai nilai yang betul.

🎜Apabila 🎜 mencipta kepingan baharu, nilai dalam kepingan baharu tidak boleh berubah kerana ia tidak digunakan semula. 🎜

Atas ialah kandungan terperinci Tingkah laku pelik tambahan dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan