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

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 

 

posted on 2019-05-16 19:21  天马行宇  阅读(154)  评论(0编辑  收藏  举报