ホームページ  >  記事  >  バックエンド開発  >  スライスをシャッフルすると、同じ基礎となる配列を参照する別のスライスに影響を与えるのはなぜですか?

スライスをシャッフルすると、同じ基礎となる配列を参照する別のスライスに影響を与えるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 22:44:02251ブラウズ

Why Does Shuffling a Slice Affect Another Slice Referencing the Same Underlying Array?

Go での配列の処理を理解する

http://golang.org/doc/Effective_go.html#arrays のドキュメントでは、Go における配列の値ベースの性質が強調されています。配列を別の配列に代入すると、すべての要素のコピーが作成されます。この原則は、関数の引数にも適用され、関数はポインタではなく配列のコピーを受け取ります。

この情報に基づいて、次のコードは、arr2 と arr に異なる配列を生成すると予想されます。 main() function:

<code class="go">package main

import (
    "fmt"
    "rand"
    "time"
)

func shuffle(arr []int) {
    rand.Seed(time.Nanoseconds())
    for i := len(arr) - 1; i > 0; i-- {
        j := rand.Intn(i)
        arr[i], arr[j] = arr[j], arr[i]
    }
}

func main() {
    arr := []int{1, 2, 3, 4, 5}
    arr2 := arr
    shuffle(arr)
    for _, i := range arr2 {
        fmt.Printf("%d ", i)
    }
}</code>

しかし、コードは予期せず arr2 もシャッフルします。この動作は、提供されたコードが配列ではなくスライスで動作するという事実に由来します。

スライス: 配列へのリファレンス

Go は、値のシーケンスを処理するためのより柔軟かつ効率的な方法としてスライスを利用します。 。スライスは基になる配列への参照であり、あるスライスを別のスライスに割り当てると、その参照が単純に複製されます。

コード例では、arr := []int{1, 2, 3, 4, 5} 行によって匿名の基になる整数配列を参照するスライス。 arr2 := arr が実行されると、同じ基になる配列も参照する新しいスライスが作成されます。

配列の処理への影響

arr と arr2 は両方とも同じ基になる配列を参照するため、arr を変更しますshuffle() 関数内の arr2 も影響します。この動作は、基になる配列の新しいコピーを作成するのではなく、単に参照を複製するだけで、あるスライスを別のスライスに割り当てるという原則と一致しています。

したがって、コードは arr と arr2 の両方を正しくシャッフルします。これは、両方とも同じ基になるものを参照するためです。整数の配列

以上がスライスをシャッフルすると、同じ基礎となる配列を参照する別のスライスに影響を与えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。