python编程入门必看——如何理解对象

【入门必看】对象不理解?很可能出现致命bug:简单的Python例子告诉你

简介:越来越多的人要在学习工作中用到编程这个工具了,其中很大一部分人用的是Python。大部分人只是做做简单的科研计算、绘图、办公自动化或者爬虫,但—— 这就不需要理解指针与面向对象了吗? 在我看来,新手或外行朋友也需要简单地理解对象概念,本文将先演示一个反例(告诉你不理解将多么容易犯错误),然后浅显地介绍一下「对象」。


致命bug
坐在电脑前的小明,一脸愁容——一个非常简单的程序,花了3个小时,她硬是不知道哪里出些了问题,导致程序不流畅。
发了几张截图给我看,说“老师,这是怎么回事?”
我一看,噢,原来是小明给我发的信息,我一下就站了起来,很快啊,就发来两个.py脚本文件,一个八十多行,一个九十多行。逻辑整体上没什么问题,只是有几处很“荒唐”,究其原因,是小明对“对象”这个概念没有去理解。
看罢,我抛开这个了问题,直接把我的腾讯会议ID甩给她,从对象这个概念开始讲解起来了,因为只要了解了对象这个传统功夫后,其问题就能自然而然就化解了。
一个简单的 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 后,是新增了一个对象,而并非只是把一个新的变量名增加到原对象而已。
我一直认为,新手对这些概念有些许了解后,将少走很多很多的弯路。
最后,你问小明有没有改好 bug ,那自然是:传统功夫点到为止!自从她跟我说她有“对象”后,她就再也没问有关于“对象”的这方面的有关问题了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容