美文网首页
切片的拷贝

切片的拷贝

作者: Linrundong | 来源:发表于2019-08-25 15:07 被阅读0次

转载出处:https://www.jianshu.com/p/be6e42747153

切片的拷贝

1.什么时候共享数据会被其他变量修改

func f1()  {
    a1 := []int{1,2,3,4,5,6}
    a2 := a1
    a3 := a1[1:3]

    a1[1] = 999
    
    fmt.Println("a1=",a1,"a2=",a2,"a3=",a3)
}

运行结果
a1= [1 999 3 4 5 6] a2= [1 999 3 4 5 6] a3= [999 3]

Process finished with exit code 0

我们清楚的看到了数据共享,此时修改了a1 ,两位两个变量都被修改

2.什么时候不会修改

func f2()  {
    a1 := []int{1,2,3,4,5,6}
    a2 := a1
    a3 := a1[1:3]

    a2 = append(a2,888)

    a1[1] = 999

    fmt.Println("a1=",a1,"a2=",a2,"a3=",a3)
}

运行结果
a1= [1 999 3 4 5 6] a2= [1 2 3 4 5 6 888] a3= [999 3]

Process finished with exit code 0

可以虽然a1被修改,a2并没有修改。我们知道append函数会面临内存的重新分配。所以等a2进行append的时候,会重新申请内存空间,将原有数组拷贝然后增加如新值。也就是当append操作的时候,此时a2 不在和a1 共享内存了。所以后续对a1的操作是不会影响到a2.

3.所有的append操作都会隔断内存共享?

func f3()  {
    a1 := []int{1,2,3,4,5,6}
    a2 := a1
    a3 := a1[1:3]
    a2 = append(a2,888)
    a3 = append(a3,777)

    a1[1] = 999

    fmt.Println("a1=",a1,"a2=",a2,"a3=",a3)
}

运行结果

a1= [1 999 3 777 5 6] a2= [1 2 3 4 5 6 888] a3= [999 3 777]

Process finished with exit code 0

这次a3 是对a1进行切片操作赋值的新变量。此时对a3进行append操作,我们发现a1的值同步被修改了。所以此时a3 和a1 仍然是共享内存,append并没有申请新的内存空间而是继续在a3的数据末尾写入,这样对于a1 是覆盖了原有值。

问题本质

a1= [1 999 3 777 5 6] cap(a1) = 6 a2= [1 2 3 4 5 6 888] cap(a2) = 12 a3= [999 3 777] cap(a3) = 5

重新运行后将三个变量cap值打印为以上输出。
问题的本质是len 和cap 的值。 在slice中,当len小于cap 的值的时候, 进行append 操作是不会造成内存的重新分配。a3 是从a1切片操作而来,我们看到a3 初始化的len =2 ,cap =5.所以在append中不会引起内存重新分配,go 运行时会继续将数据依次写入。这样就修改了a3 和a1共享的内存空间。 对于a2,在初始化的时候len =cap =6. 在append操作的时候就会重新申请空间,go会分配当前空间 * 2 的内存。所以append后的cap就是12 如上。

相关文章

  • 切片的拷贝

    转载出处:https://www.jianshu.com/p/be6e42747153 切片的拷贝 1.什么时候共...

  • 列表,元组,文件操作1

    列表 切片 方法 深浅拷贝深拷贝,故名思议,最外层列表内的全部拷贝浅拷贝,外层的元素被拷贝,嵌套内不会被拷贝 元组...

  • ArcGIS 切片服务无法访问到切片,Server Manage

    一、报错内容 从切片服务器拷贝的切片包,在本地ArcGIS Server启动服务后无法加载切片,切片图标为灰色。 ...

  • 2019-10-27

    深拷贝和浅拷贝 浅拷贝 切片[:]操作 和copy()函数相同,都是浅拷贝。示例:copy()函数说明:c拷贝一个...

  • 浅拷贝和深拷贝区别

    浅拷贝: a = [1,'changhao',[]]b = a[:]切片操作就是浅拷贝b 的所有地址引用原来a中的...

  • python切片是引用还是复制

    切片是深拷贝 等号是引用,不是拷贝 深拷贝、浅拷贝都属于拷贝,改变原始列表拷贝列表通常不变,为什么说深、浅呢?是指...

  • Python基础总结-08(函数基础)

    一、深拷贝和浅拷贝 拷贝:将变量中的值复制一份,产生新的数据,返回新数据所对应的地址浅拷贝:直接拷贝地址(切片和字...

  • Python 之 列表

    [ toc ] 定义 增 删 切片 其他方法(拷贝,排序,合并)

  • 数组和切片区别

    数组赋值会直接拷贝一份,而切片赋值会传指针。 函数传参,同上 当切片append的时候,go会考虑切片的cap值,...

  • 【第63天】python全栈从入门到放弃

    1.深拷贝和浅拷贝 1-1浅拷贝 1-2深拷贝 2 可迭代元素迭代的时候,不要改变对象的长度,会出事的。 3 切片...

网友评论

      本文标题:切片的拷贝

      本文链接:https://www.haomeiwen.com/subject/udnhectx.html