Python中的引用与浅拷贝

导语

挺绕的知识点,自己边看别人的博客边整理自己遇到的问题,磕磕绊绊写下这篇博客,有错误欢迎在评论区指出

浅谈变量、对象及引用间的关系

在这里插入图片描述

  • 变量 :变量可以看作是一个标签,它无类型,建立后存入系统变量表
  • 引用 :引用可以看作是一个特殊的"指针",它存放着对象的地址
  • 对象 :对象是计算机分配的一块实际的内存,里边存放着相应的值

引用(reference)

在Python中,赋值语句,总是在 建立对象的引用(建立指针) 或是 修改变量的引用(修改指针),通过引用可以查看相应的值在内存中的存放地址,Python中,通过内置函数id()来查看对象的存放地址,如

list1 = [0,1,2]
id(list1)	#该语句可以查看list1列表在内存中的存放地址

可变对象与不可变对象的引用问题

Python中,对象可分为可变对象和不可变对象,首先讨论什么是可变对象,什么是不可变对象

  • 可变对象 :如list、set、dict
list1 = [100,200,300]	#可变对象,赋值语句在此处是在建立对象的引用
list2 = list1			
print(id(list1),id(list2))
list1[0] = 0
print(list2)

在这里插入图片描述
list1与list2指向同一块内存,通过修改list1,可以发现list2也受到了影响

  • 不可变对象 :如str、number、tuple
str1 = '123'	#不可变对象,赋值语句在此处是在建立对象的引用
print(id(str1))
str1 = '012'	#创建新对象,并修改该变量的引用
print(id(str1))

在这里插入图片描述
此处的赋值语句,是在先创建了一个新的str对象的基础上,在修改变量str1的引用

浅拷贝(shallow copy)

在使用NumPy的ndarray对象时,可使用该对象的copy()方法实现浅拷贝(shallow copy)

import numpy as np
array = np.arange(5)
array_illusion = array
array_copy = array.copy()
print(id(array),id(array_illusion),id(array_copy))

在这里插入图片描述
根据输出的内存地址可以得知,未使用copy()方法的赋值语句,只是给第1行建立的ndarray对象又建立了一个新的引用,并贴上array_illusion的“标签”,而使用copy()方法则是真正的建立了一个新的ndarray对象

后记

最近在完成学校的数值计算作业的时候,将Matlab的程序转为了Python的程序来实现,由于里边每一次的迭代都需要重新赋值,自己在编写的时候又忽略了Python赋值语句本质上是在操控引用,不像Matlab那样只需要空间预分配就行,进而导致怎么都算不出正确结果,查阅资料补了补知识,在Python赋值语句的后边加上了.copy(),便得到了正确的结果,所以决定写下这篇博客,作为一个学习笔记。本来还想一起把深拷贝的内容也写了,但考虑到自己掌握的也不是太好,同时也不在这篇文章的讨论范围内,就索性等有时间再写了>_<

参考文章

https://blog.youkuaiyun.com/qq_40911298/article/details/100060756
https://my.oschina.net/leejun2005/blog/145911
https://blog.youkuaiyun.com/Invokar/article/details/89138684

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值