拷貝 異常處理

2022-08-23 00:42:07 字數 3580 閱讀 3685

存值個數

資料型別

單個值數字,字串

多個值(容器)

列表,元組,字典,集合

可變or不可變

資料型別

可變列表,字典,集合

不可變數字,字串,元組

有序or無序

資料型別

有序(可按索引取值)

字串,列表,元組

無序字典,集合

訪問型別

資料型別

直接訪問

數字順序訪問(序列型別)

字串,列表,元組

key值對映(對映型別)

字典在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用。拷貝一般有三種方法:拷貝,淺拷貝,深拷貝。

拷貝/淺拷貝/深拷貝都是針對可變資料型別而言我們這裡使用列表作為演示

##當我們定義了乙個列表,並且要將這個列表賦值給另乙個列表的時候

a = [1,2,3,4]

b = a

print(a) # [1, 2, 3, 4, 5]

print(b) # [1, 2, 3, 4, 5] ##我們可以看到a列表改變了b列表也跟著改變,這是因為這個賦值動作只是讓b列表獲取a列表的引用,a與b引用的是同乙個列表。

##淺拷貝是使用copy包的中copy方法或者列表的內建方法copy實現的

import copy

a = [1,2,3,4]

b = copy.copy(a)

print(a) # [1, 2, 3, 4, 5]

print(b) # [1, 2, 3, 4] ##我們可以看到a列表的改變不能再影響到b列表了。這是因為b列表新開闢了乙個記憶體空間並將a列表中的指向全部複製一遍到列表b中。

但是,還有乙個問題,如果列表中還有乙個引用列表呢?

import copy

a = [1,2,3,[4,5]]

b = copy.copy(a)

print(a) # [1, 2, 3, [4, 5], 5]

print(b) # [1, 2, 3, [4, 5]] ##看上去好像沒有什麼變化,但是我們改變一下新增的位置

print(a) # [1, 2, 3, [4, 5, 6], 5]

print(b) # [1, 2, 3, [4, 5, 6]] ##我們可以看到,當改變的是列表裡面的列表的時候b列表也會隨著a列表的改變而改變。這是因為,copy是將a列表的指向也全部都複製下來,那麼列表中的那個列表的引用也拷貝下來了。雖然a列表和b列表看著沒有什麼關係,但是他們內部的列表引用的是同乙個記憶體位址。所以當a列表改變了b列表也會隨著改變。

##既然出現了這種情況,那麼肯定是有乙個解決辦法的。那就是copy包中的深拷貝。

import copy

a = [1,2,3,[4,5]]

b = copy.deepcopy(a)

print(a) # [1, 2, 3, [4, 5], 5]

print(b) # [1, 2, 3, [4, 5]] ##看上去好像也沒有什麼變化,那讓我們改變一下新增的位置

print(a) # [1, 2, 3, [4, 5, 6], 5]

print(b) # [1, 2, 3, [4, 5]] ##由這裡可以看出來a列表是真的和把列表沒有任何關係了。但是這種方法特別浪費記憶體的,因為不僅僅是外面的列表要開闢乙個空間,列表裡面的列表也是要開闢乙個新空間。

異常就是程式執行時發生錯誤的訊號(在程式出現錯誤時,則會產生乙個異常,若程式沒有處理它,則會丟擲該異常,程式的執行也隨之終止)

語法錯誤,根本過不了python直譯器的語法檢測,必須在程式執行前就改正。

##一般這種錯誤ide工具會給你標出來

##例如:

1.if

2.name =

print(name)  # nameerror

dic =

print(dic['age']) # keyerror

##如果我們知道這個會出現異常

age = input('請輸入乙個數').strip()

if age.isdigit(): # 只有在age為字串形式的整數時,下列**才不會出錯,該條件是可預知的

age = int(age)+1

print(age)

##如果我們無法**這個地方到底會不會出現異常可以這樣寫

try:

被檢測的**塊

except 異常型別:

try中一旦檢測到異常,就執行這個位置的邏輯

舉例:

a = input('請輸入乙個數').strip()

if a.isdigit(): # 只有在a為字串形式的整數時,下列**才不會出錯,該條件是可預知的

age = int(age)

try:

print(100/a)

except zerodivisionerror:

print('除數不能為零')

##當我們輸入的數是零的時候try裡面的輸出語句就會報錯,讓except所捕獲到這個異常是不是和我定義的異常一樣,如果一樣我就執行except裡面的內容

但是,如果發生了未指定異常的時候就無法處理了。

s = 'hello'

try:

a = int(s)

except indexerror as e: # 未捕獲到異常,程式直接報錯

print(e)

當發生這種情況的話只能將可能會碰到的異常都寫上去

s = 'hello'

try:

a = int(s)

except indexerror as e:

print(e)

except keyerror as e:

print(e)

except valueerror as e:

print(e

當然,還有一種方法就是使用萬能的excption

s = 'hello'

try:

a = int(s)

except exception as e:

print(e)

如果我們需要無論是有沒有出現錯誤都執行的話可以使用finally

s = 'hello'

try:

int(s)

except indexerror as e:

print(e)

except keyerror as e:

print(e)

except valueerror as e:

print(e)

finally:

print('無論異常與否,都會執行該模組,通常是進行清理工作')

struts 異常處理 全域性異常處理

記錄一下全域性異常處理的過程 處理主動丟擲的異常,轉向錯誤提示頁面。1 寫乙個自己的異常,繼承runtimeexception,從父類生成構造方法 package me.yndy.srtp.exception suppresswarnings serial public class errorexc...

python異常處理 Python 異常處理

使用者輸入不完整 比如輸入為空 或者輸入非法 輸入不是數字 異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下 在python中不同的異常可以用不同的型別 python中統一了類與型別,型別即類 去標識,不同的類物件標識不同的異常,乙個異常標識一種錯 觸發indexerror 觸...

01 異常 異常處理

注意 1 對定義的變數能初始化的盡量初始化,如果賦的值可能產生誤導,可以採用可空型別 例如 double?dnumres null 3 異常 執行的時候出現的錯誤,或bug 編寫 的預期條件玉實際條件不穩合 異常的機制是為了保證程式可以一直正常執行。丟擲異常 throw new exception ...