Python 的赋值,浅拷贝和深拷贝详解

 更新时间:2021年12月19日 16:01:39   作者:季布,  
这篇文章主要为大家介绍了Python 的赋值,浅拷贝和深拷贝,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>

先明确几点

不可变类型:该数据类型对象所指定内存中的值不可以被改变。

(1)、在改变某个对象的值时,由于其内存中的值不可以被改变,所以,会把原来的值复制一份再进行改变,这样就会计算机会开辟一段新的内存空间来存储新的值。

可变类型:该数据类型的对象所指定的地址上面的值可以被改变。

(1)、变量被改变后,其所指向的内存地址上面的值,直接被改变,没有发生复制行为,也没有发生开辟新的内存地址行为,不会重新开辟空间。

  • 变量:是一个系统表的元素,拥有指向对象的连接空间
  • 对象:被分配的一块内存,存储其所代表的值
  • 引用:是自动形成的从变量到对象的指针

当在代码编辑器中写出

test = 'python'

python解释器会

1.创建变量test

2.创建一个对象(分配一块内存),来存储python值

3.将变量与对象通过指针

链接起来,从变量到对象的连接称为引用(变量引用对象)

赋值

复制了新对象的引用,不会开辟新的内存空间

浅拷贝

拷贝父对象,不会拷贝对象内部的子对象。

1)浅拷贝是指拷贝的只是原对象元素的引用,换句话说,浅拷贝产生的对象本身是新的,但是它的内容不是新的,只是对原对象的一个引用。

2)浅拷贝是指把存放变量的地址值传给被赋值,最后两个变量引用了同一份地址。

深拷贝

深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联。所有改变原来被赋值对象不会对已经复制出来的新对象产生影响

对于不可变对象的深浅拷贝示例

import copy
test = 'abc'
print("=====赋值=====")
b=test
print(test)
print(b)
print(id(test))
print(id(b))
print("=====浅拷贝=====")
b=copy.copy(test)
print(test)
print(b)
print(id(test))
print(id(b))
print("=====深拷贝=====")
b=copy.deepcopy(test)
print(test)
print(b)
print(id(test))
print(id(b))

结果
=====赋值=====
abc
abc
1855476943856
1855476943856
=====浅拷贝=====
abc
abc
1855476943856
1855476943856
=====深拷贝=====
abc
abc
1855476943856
1855476943856

通过以上可得出结果:

不可变类型没有被拷贝的说法,不管怎么样id地址都一样

对于可变对象深浅拷贝示例

import copy
test=[1,2,3]
print("=====赋值=====")
b=test
print(test)
print(b)
print(id(test))
print(id(b))
print("=====浅拷贝=====")
b=copy.copy(test)
print(test)
print(b)
print(id(test))
print(id(b))
print("=====深拷贝=====")
b=copy.deepcopy(test)
print(test)
print(b)
print(id(test))
print(id(b))

结果
=====赋值=====
[1, 2, 3]
[1, 2, 3]
2461497814592
2461497814592
=====浅拷贝=====
[1, 2, 3]
[1, 2, 3]
2461497814592
2461497661824
=====深拷贝=====
[1, 2, 3]
[1, 2, 3]
2461497814592
2461497661888

import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象
b = a                       #赋值,传对象的引用
c = copy.copy(a)            #对象拷贝,浅拷贝
d = copy.deepcopy(a)        #对象拷贝,深拷贝
a.append(5)                 #修改对象a
a[4].append('c')            #修改对象a中的['a', 'b']数组对象
print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )

结果
('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
('d = ', [1, 2, 3, 4, ['a', 'b']])

1.外层添加元素时,浅拷贝不会随原列表变化而变化;内层添加元素时浅拷贝才会变化

2.无论源列表如何变化,深拷贝都保持不变

3.复制对象随原列表一起变化

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 手把手教你快速安装gpu版本的pytorch(详细图文教程)

    手把手教你快速安装gpu版本的pytorch(详细图文教程)

    在Windows 10上安装PyTorch时,通常默认安装的是CPU版本,且下载速度较慢,本文提供了一个详细的安装指南,包括如何检查CUDA版本、选择合适的PyTorch、torchvision和torchaudio版本,并通过pip而非conda进行安装,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • 深入解析python返回函数和匿名函数

    深入解析python返回函数和匿名函数

    这篇文章主要介绍了python返回函数和匿名函数的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头

    浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头

    这篇文章主要介绍了浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Jupyter notebook之如何快速打开ipynb文件

    Jupyter notebook之如何快速打开ipynb文件

    这篇文章主要介绍了Jupyter notebook之如何快速打开ipynb文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • PyQt5实现用户登录GUI界面及登录后跳转

    PyQt5实现用户登录GUI界面及登录后跳转

    PyQt5是强大的GUI工具之一,通过其可以实现优秀的桌面应用程序。本文主要介绍了PyQt5实现用户登录GUI界面及登录后跳转,具有一定的参考价值,感兴趣的可以了解一下
    2021-11-11
  • python的scikit-learn将特征转成one-hot特征的方法

    python的scikit-learn将特征转成one-hot特征的方法

    今天小编就为大家分享一篇python的scikit-learn将特征转成one-hot特征的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python自动化测试无法启动谷歌浏览器问题

    python自动化测试无法启动谷歌浏览器问题

    这篇文章主要介绍了python自动化测试无法启动谷歌浏览器问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • python计算质数的6种方法

    python计算质数的6种方法

    本文主要介绍了python计算质数的6种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 解决python xlrd无法读取excel文件的问题

    解决python xlrd无法读取excel文件的问题

    今天小编就为大家分享一篇解决python xlrd无法读取excel文件的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python 变量教程私有变量详解

    Python 变量教程私有变量详解

    这篇文章主要介绍了Python 变量教程私有变量详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08

最新评论