导语
挺绕的知识点,自己边看别人的博客边整理自己遇到的问题,磕磕绊绊写下这篇博客,有错误欢迎在评论区指出
浅谈变量、对象及引用间的关系
- 变量 :变量可以看作是一个标签,它无类型,建立后存入系统变量表
- 引用 :引用可以看作是一个特殊的"指针",它存放着对象的地址
- 对象 :对象是计算机分配的一块实际的内存,里边存放着相应的值
引用(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