我想将数字附加到列表中,但是我的分片仅在for循环中更新值。
如何在外部更新它?
slice := []int{5,4,3,2,1}
for i := 0; i < len(slice); i++ {
slice := append(slice, i)
fmt.Println(slice)
}
fmt.Println(slice)
实际结果
[5 4 3 2 1 0]
[5 4 3 2 1 1]
[5 4 3 2 1 2]
[5 4 3 2 1 3]
[5 4 3 2 1 4]
[5 4 3 2 1]
预期结果
[5 4 3 2 1 0]
[5 4 3 2 1 1]
[5 4 3 2 1 2]
[5 4 3 2 1 3]
[5 4 3 2 1 4]
[5 4 3 2 1 0 1 2 3 4]
此代码在Python中有效,但是在执行过程中我没有发现某些问题
由于您使用append()
而不是slice
,因此不会将short variable declaration的结果存储在“原始” assignment中:
slice := append(slice, i)
简短的变量声明(由于它与原始slice
变量位于不同的块中)创建新变量(遮盖外部的slice
),并在循环内打印此新变量。因此,每个追加的结果仅在循环体内可见,并且在迭代结束时丢失。而是使用赋值:
slice = append(slice, i)
但是,执行此操作时,将得到一个无限循环,因为您的循环条件为i < len(slice)
,并且slice
在每次迭代中都会增长。
相反,您应该执行以下操作:
for i, length := 0, len(slice); i < length; i++ {
slice = append(slice, i)
fmt.Println(slice)
}
输出将是(在Go Playground上尝试):
[5 4 3 2 1 0]
[5 4 3 2 1 0 1]
[5 4 3 2 1 0 1 2]
[5 4 3 2 1 0 1 2 3]
[5 4 3 2 1 0 1 2 3 4]
[5 4 3 2 1 0 1 2 3 4]
请注意,如果使用for range
,将会得到相同的结果,因为那样只会对切片进行一次评估:
for i := range slice {
slice = append(slice, i)
fmt.Println(slice)
}
在Go Playground上尝试此。