存值個數
資料型別
單個值數字,字串
多個值(容器)
列表,元組,字典,集合
可變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 ...