zoukankan      html  css  js  c++  java
  • 函数传参涉及到副本的创建与拷贝问题分析

    遇到一个问题,是这样的:

    b = [1, 2, 3]
    
    
    def aaa(b):
        b.append(4)
    
    
    def bbb(b):
        b = 5
    
    
    aaa(b)
    print(b)  # [1, 2, 3, 4]
    
    bbb(b)
    print(b)  # [1, 2, 3, 4]

    为什么呢,为什么通过函数传参,去修改参数,结果不一致呢?

    原因是因为函数传参涉及到了参数副本的创建与拷贝,具体详解:

    圆圈2为传参时函数建立的传入变量(圆圈1)的副本,他们拥有共同的指向(圆圈3)。那么显然在函数中,如果将副本重新指向一块新的内存,传入变量(圆圈1)的指向并不会改变,换句话说这种操作并不能影响函数外的变量。

      也就是说,源地址和副本地址2个指向相同的地址,这个地址是可以变的list形式, 那么aaa函数只是给这个共同的指向地址的内容中添加了数据,没有改变指向地址,所以结果不变

      但是函数bbb,就不一样了,它要修改副本的地址指向,所以就这样了.

    参考博客:  https://blog.csdn.net/Lin_RD/article/details/88088217 

     

  • 相关阅读:
    经验1
    Caffe和MatConvNet安装
    Matconvet的学习笔记
    CNN数据准备
    深度学习之卷积和池化
    深度学习之CNN的推导
    深度学习八(总结)
    深度学习七(卷积神经网络)
    深度学习六
    深度学习五
  • 原文地址:https://www.cnblogs.com/yuanyongqiang/p/10877496.html
Copyright © 2011-2022 走看看