>백엔드 개발 >Golang >Append()는 원래 슬라이스(2D 슬라이스)를 재귀적으로 수정할 수 있습니다.

Append()는 원래 슬라이스(2D 슬라이스)를 재귀적으로 수정할 수 있습니다.

WBOY
WBOY앞으로
2024-02-06 08:27:04473검색

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

문제 내용

(인코딩 문제는 합이 목표에 도달하는 모든 조합에 대해 후보 arr의 각 요소에 대해 횟수 제한 없이 솔루션을 생성하는 것입니다.)

2D [][]int 切片 theList 在附加 []int (tmpCombo) 的递归中通过引用传递,但附加后,其中一个元素被修改,[3 3 3 3 3 3] 更改为 [3 3 3 3 3 2]。所以我必须在执行 append() 之前复制 tmpComboappend(arr, ele) 是否更改了原始 arr 切片?如果是这样,我应该观察到更多原始的 arr 被修改,但这种情况只发生一次。所以我实际上很困惑这个切片 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一个>.

기본적으로 슬라이스가 지정된 용량으로 한 위치에 데이터를 저장하지만 길이가 별도의 속성으로 있는 경우... 제 경우에는 변수가 재할당되지 않기 때문에 데이터를 여러 append(tmpCombo, target) 实际上会修改 tmpCombo로 처리합니다./ 새로운 길이가 업데이트되고 동일한 위치의 기본 데이터가 수정됩니다(재할당되지 않은 경우).

tldr. 다음 방법 중 하나를 사용하여 동일한 데이터의 새 복사본을 전달해야 합니다.

make()新建切片并copy()结束(make()특정 용량 할당)

또는

append(nil []int, arr...]. (append() 더 많은 메모리를 할당할 수 있지만 자주 수정하는 데 적합합니다.)

위 내용은 Append()는 원래 슬라이스(2D 슬라이스)를 재귀적으로 수정할 수 있습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제