ホームページ >バックエンド開発 >Golang >append() は元のスライス (2D スライスを再帰的に) 変更する可能性があります

append() は元のスライス (2D スライスを再帰的に) 変更する可能性があります

WBOY
WBOY転載
2024-02-06 08:27:04471ブラウズ

append() 可能会修改原始切片(2d 切片递归)

問題の内容

(エンコード問題は、候補 arr の各要素の回数が目標に達するすべての組み合わせの解を生成することです。制限されていません。)

2D[][]int スライス theList 再帰で参照によって渡され、 []int (tmpCombo) が追加されますが、その後追加すると、要素の 1 つが変更され、[3 3 3 3 3 3][3 3 3 3 3 2] に変更されます。したがって、append() を実行する前に tmpCombo をコピーする必要があります。 append(arr, ele) 元の arr スライスは変更されましたか?そうであれば、元の arr がさらに変更されるのを観察する必要がありますが、これは 1 回しか起こりません。そのため、このスライス append() がどのように機能するかについて、実際には混乱しています。

https://go.dev/play/p/PH10SxiF7A5

リーリー

(for ループを実行してスライスに追加し続けてみましたが、元のスライスはまったく変更されませんでした...)

<code>
...
theList: [.... [3 3 3 3 3 3]]
theList: [.... [3 3 3 3 3 2] [3 3 3 3 2 2 2]]
</code>

正解


この回答は同じ問題を示しているので、理解できましたhttps://www.php.cn/link/0d924f0e6b3fd0d91074c22727a53966一个>.

基本的に、スライスが指定された容量で 1 つの場所にデータを保存するが、長さは別のプロパティとして持つ場合...私の場合、複数の append(tmpCombo, target) データtmpCombo は、変数が新しい長さで再割り当て/更新されず、同じ場所にある基になるデータが (再割り当てされない場合に) 変更されるため、実際には変更されます。

tldr.次のいずれかの方法を使用して、同じデータの新しいコピーを渡してください:

make()新しいスライスを作成し、copy()終了 (make()特定の容量を割り当てる)

###または###

append(nil []int, arr...]

. (append() はより多くのメモリを割り当てる可能性がありますが、頻繁な変更に適しています)

以上がappend() は元のスライス (2D スライスを再帰的に) 変更する可能性がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。