简介:越来越多的人要在学习工作中用到『编程』这个工具了,其中很大一部分人用的是Python。大部分人只是做做简单的科研计算、绘图、办公自动化或者爬虫,但—— 这就不需要理解「指针与面向对象」了吗? 在我看来,新手或外行朋友也需要简单地理解「对象」概念,本文将先演示一个反例(告诉你不理解将多么容易犯错误),然后浅显地介绍一下「对象」。
一个简单的 numpy 反例
我们以 Python 中最常用的矩阵与代数库 numpy
为例。
import numpy as np
复制代码
我们现在定义一个长度为 3 的向量 vec_origin
,其中存放 1,2,3
。然后我们打印一下看看。
vec_origin = np.array([1, 2, 3])
print(vec_origin)
复制代码
打印结果如下。
[1 2 3]
复制代码
假如我们需要复制一下向量 vec_origin
,那么,“自然”是做个等号。如下。然后打印一下。
vec_copy = vec_origin
print(vec_copy)
复制代码
输出结果为如下。
[1 2 3]
复制代码
接下来, vec_origin
与 vec_copy
将参与不同的运算任务,其将被加减乘除,还有 赋值 。问题就出在了,如果我们为 vec_copy
赋值,那么 vec_origin
的值也将被改变。不信你试试下面的代码。
print("vec_origin", vec_origin)
print("vec_copy", vec_copy)
vec_copy[0] = 9
print("我们只改变了 vec_copy 的值,但是:")
print("vec_origin", vec_origin)
print("vec_copy", vec_copy)
复制代码
输出结果如下。
vec_origin [1 2 3]
vec_copy [1 2 3]
我们只改变了 vec_copy 的值,但是:
vec_origin [9 2 3]
vec_copy [9 2 3]
复制代码
但是,vec_origin
的值也跟着改变了。这是为什么呀!
要知道,我们对变量赋值与复制,是不会改变原值的呀!如下。
a = 1
b = a
print(a) # 1
print(b) # 1
b = 9
print(a) # 1
print(b) # 9
复制代码
numpy 中的矩阵/向量,是个对象
对于 numpy
来讲,我们声明的矩阵或者向量,并不是一个“数字”那么简单,而是一个有「身份证」的『对象』。
一个对象可以有多个名字,但身份证只能有一个。换句话说,身份证才是唯一标识。
对于不是单个数值的数,我们的 =
赋值,只不过是 给对象新增了一个名字罢了。
不信,我们用 python 内置的 id()
函数看看 vec_origin
与 vec_copy
名字是不是一样的。
print(id(vec_origin))
print(id(vec_copy))
复制代码
结果如下。
2006971817136
2006971817136
复制代码
很显然,二者的身份证是一个,这根本就是同一个向量。
对于 list
、 dict
等等,都是同理。
那么,该如何复制呢?
我的建议是,你没有必要去可以背诵方法。不同类型的对象有不同赋值方法。对于 numpy 的向量,我们去互联网搜索一下就好,检索词:numpy 复制
。
我查到的方法是:使用 np.copy
。
那么我们试验一下。
import numpy as np
vec_origin = np.array([1, 2, 3])
vec_copy = np.copy(vec_origin) # 这里复制
print("vec_origin", vec_origin)
print("vec_copy", vec_copy)
vec_copy[0] = 9
print("我们只改变了 vec_copy 的值,但是:")
print("vec_origin", vec_origin)
print("vec_copy", vec_copy)
print(id(vec_origin))
print(id(vec_copy))
复制代码
结果如下。
vec_origin [1 2 3]
vec_copy [1 2 3]
我们只改变了 vec_copy 的值,但是:
vec_origin [1 2 3]
vec_copy [9 2 3]
2343952817328
2343952817568
复制代码
如你所见, np.copy
后,是新增了一个对象,而非仅仅是为原对象新增了一个变量名而已。
这是 零基础编程
系列的第一篇文章,之后,我们将用简单的例子讨论:面向对象
、指针
、数据结构
等等基础概念。我一直认为,新手对这些概念有些许了解后,将少走很多很多的弯路。
想要获取更多Python学习资料可以加我QQ:2955637827