浅谈python中的引用和拷贝问题

Posted liangweijiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈python中的引用和拷贝问题相关的知识,希望对你有一定的参考价值。

一.引用

a = [a, b, c]
b = a
print(id(a))
print(id(b))


135300560
135300560

  可以看到,变量a 和 b 的 id是完全一样的,这就说明a和b是同时指向内存的同一个区域的,即b随a的变化而变化.

技术图片

 

a = [a, b, c]
b = a
a[1] = d
print(b)
b[2] = e
print(a)

[a, d, c]
[a, d, e]

 

二.浅拷贝  

  浅拷贝只是复制了的父对象,即复制后的变量和复制前的子对象还是指向同一个对象

  浅拷贝可以写为 copy.copy(obj) 或者 obj.copy()

import copy
a = [‘a‘, ‘b‘, [‘c‘, ‘d‘, ‘e‘]]
b = copy.copy(a)
a.append(‘e‘)
print(b)
a[0] = ‘g‘
print(b)
a[2].append(‘f‘)
print(b)

[‘a‘, ‘b‘, [‘c‘, ‘d‘, ‘e‘]]
[‘a‘, ‘b‘, [‘c‘, ‘d‘, ‘e‘]]
[‘a‘, ‘b‘, [‘c‘, ‘d‘, ‘e‘, ‘f‘]]

       画个图来理解就是如下:

技术图片

 

 

 当只有a元素的子元素里的元素有变化时,b才会引起改变

 

三.深拷贝

  深拷贝就比较好理解了,它相当于开辟了一个新空间是新指针指向新的空间,无论原对象怎么变化,新对象都不变

import copy
a = [a, b, [c, d, e]]
b = copy.deepcopy(a)
a.append(e)
print(b)
a[0] = g
print(b)
a[2].append(f)
print(b)


[a, b, [c, d, e]]
[a, b, [c, d, e]]
[a, b, [c, d, e]]

技术图片

 

 

 

 

 

 

以上是关于浅谈python中的引用和拷贝问题的主要内容,如果未能解决你的问题,请参考以下文章

浅谈js中的深拷贝和浅拷贝

浅谈java浅拷贝和深拷贝

浅谈深拷贝和浅拷贝及几种实现方法

python中的深拷贝和浅拷贝理解

浅谈JS中的浅拷贝与深拷贝

Python中的对象引用浅拷贝与深拷贝