美文网首页
学会这些,可以让你以后在工作上比别人快一倍!!!

学会这些,可以让你以后在工作上比别人快一倍!!!

作者: Python热衷者 | 来源:发表于2020-12-29 16:07 被阅读0次

【入门必看】对象不理解?很可能出现致命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 ,那自然是:传统功夫点到为止!自从她跟我说她有“对象”后,她就再也没问有关于“对象”的这方面的有关问题了。

相关文章

  • 学会这些,可以让你以后在工作上比别人快一倍!!!

    【入门必看】对象不理解?很可能出现致命bug:简单的Python例子告诉你简介:越来越多的人要在学习工作中用到编程...

  • 2019-03-28

    赚钱最快的方式,学会这些可以让你收钱,收人!最快的方式,学会这些可以让你收钱,收人,收心收灵魂,亲爱的朋友...恭...

  • 不要认命

    我从不相信命。学生时代,我接受能力比别人差一点。别人用一倍努力就可以做到的事,我就用十倍。你可以做到,我同样可以,...

  • 有一种菇凉,她们爱就爱了

    有一个菇凉做事总是很心急,走路速度比别人快一倍,吃饭永远是她在等别人吃完,一边催着别人快点吃完,一边风风火火...

  • 生命的长度和宽度

    这个月忽然领悟到,财富自由你就可以比别人享受更长的生命和宽度。 早日财富自由,你就可以不再被捆在工作上,而可以早早...

  • 宝草帽

    从前,有个小伙子钱包比脸还干净,是一个穷鬼。以打柴为生,大家都叫他柴哥。他干活比别人快一倍,砍了柴就去换米,每天天...

  • 选择大于努力

    如果你的目的是南极,却一直往北走,也许你终有一天可以到达,毕竟地球是圆的,可是南辕北辙,你比别人浪费多了一倍的时间...

  • 闯红灯

    闯红灯这件事,闯的好,你比别人快一秒,闯不好你就比别人快一辈子!

  • Get这些技能,你的业绩翻一倍

    小编在这里给大家分享一下如何准确用GOOGLE/YAHOO/BIYING 找客户邮箱方法,学会这些,你的业绩翻一倍...

  • 感悟

    人生最大的成就不是你拥有了多少, 而是你在以后的生活中学会了麻烦别人, 学会了求助别人!

网友评论

      本文标题:学会这些,可以让你以后在工作上比别人快一倍!!!

      本文链接:https://www.haomeiwen.com/subject/oyzfoktx.html