學會這些,可以讓你以後在工作上比別人快一倍!!

2021-10-13 09:30:54 字數 3046 閱讀 8698

【入門必看】物件不理解?很可能出現致命bug:簡單的python例子告訴你

簡介:越來越多的人要在學習工作中用到程式設計這個工具了,其中很大一部分人用的是python。大部分人只是做做簡單的科研計算、繪圖、辦公自動化或者爬蟲,但—— 這就不需要理解指標與物件導向了嗎? 在我看來,新手或外行朋友也需要簡單地理解物件概念,本文將先演示乙個反例(告訴你不理解將多麼容易犯錯誤),然後淺顯地介紹一下「物件」。

坐在電腦前的小明,一臉愁容——乙個非常簡單的程式,花了3個小時,她硬是不知道**出些了問題,導致程式不流暢。

發了幾張截圖給我看,說「老師,這是怎麼回事?」

我一看,噢,原來是小明給我發的資訊,我一下就站了起來,很快啊,就發來兩個.py指令碼檔案,乙個八十多行,乙個九十多行。邏輯整體上沒什麼問題,只是有幾處很「荒唐」,究其原因,是小明對「物件」這個概念沒有去理解。

乙個簡單的 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 ,那自然是:傳統功夫點到為止!自從她跟我說她有「物件」後,她就再也沒問有關於「物件」的這方面的有關問題了。

這些應用可以讓你的kindle發揮到極致

硬體與軟體總有著說不清道不明的關係,軟體通過硬體實現功能,硬體受控於軟體,好的應用直接影響使用者體驗,今天,雷鋒網就和大家分享一下 kindle 上那些經典的應用。多看 kindle國內第三方系統 如果動手能力弱或者懶得折騰的同學,kindle 刷上多看系統倒是乙個不錯的選擇,相比原生系統,多看系統...

5分鐘學會這些內容,你可以把3dsamx玩得很6

1 三維空間能力的鍛鍊,熟練掌握檢視 座標與物體的位置關係。做到放眼過去就可以判斷物體的空間位置關係,可以隨心所欲地控制物體的位置。這是最基本要掌握的內容,如果掌握不好,下面的所有內容都會受到影響。有了設計基礎和空間能力的朋友,掌握簡單 沒有基礎的朋友,科學的學習和鍛鍊方法,也可以很快地掌握。2 基...

使用這些APP讓你的工作生活更加精簡極致

把工作的文件檔案掃瞄成電子版 強大的工具聚合軟體 這個軟體聚集了大量的實用的工具,而且軟體只有兩三兆的大小,占用的記憶體非常的小,支援各種工作或者生活中常用的小工具,比如詞典翻譯,生成短 帶殼截圖,匯集了100多種實用的工具,有些需要用乙個軟體去解決的問題,這個軟體的乙個小工具就可以解決。但是你知道...