變量的類型python
可變 於 不可變類型code
這裏的可變於不可變 針對的是變量的id 和value值 id不變的狀況下,在原來id基礎上(內存地址)的值是否是能夠改 能夠改的是可變類型 不能夠改的是不可變類型內存
可變類型:舊瓶裝新酒 值改變,id不變,證實改的是原值,證實原值是能夠被改變的,字符串
不可變類型:新瓶裝新酒,沒法用舊瓶裝新酒 值改變,id也變了,證實是產生新的值,壓根沒有改變原值,證實原值是不能夠被修改的class
int類型 folat類型 str類型 bool 布爾類型 是不可變類型 id於value 是一個總體 沒法分開import
a = 10 print(id(a)) a = 1000 print(id(a))
140703328683968
2810231683568基礎
a = 134.5 print(id(a)) a = 1314.97 print(id(a))
1888924248944
1888922137744阿里巴巴
a = "阿里巴巴是個快樂的青年" print(id(a)) a = "阿里巴巴不快樂拉" print(id(a))
2032669169104
2032669237968變量
a=(10>9)
print(id(a))
140703328405328
a=(10<9)
print(id(a))
140703328405360循環
list dic 可變類型
list_t = [1, 2, 3, 4, 5] print(id(list_t)) list_t[0] = 75589 print(list_t, id(list_t))
1262084012544
[75589, 2, 3, 4, 5] 1262084012544
也就是list_t中的值能夠改 list_t的id不變
list_t = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5} print(id(list_t)) list_t['a'] = 75589 print(list_t, id(list_t))
2702791492992
{'a': 75589, 'b': 2, 'c': 3, 'd': 4, 'e': 5} 2702791492992
在字典中 字典的key 也就是上面的a b c d e 必須是不可變類型
循環判斷前置內容 條件
什麼內容能夠做爲判斷的條件那
條件能夠分爲兩種 一種是顯示條件 一種是隱士條件
顯示條件
if 10 > 6 and 10 > 7:# 這種判斷條件 數字判斷 邏輯判斷均可以做爲判斷條件 最終得出的是True 或這false print("你個傻子") if True: # 也能夠直接用Ture false做爲判斷條件 print("你個大傻子")
你個傻子
你個大傻子
隱式布爾值是
int數字類型 float 浮點型 str 字符串類型 llist列表 dic字典都是True
if 10: print("你個傻子") if "a": print("你個大傻子") if 3.14: print("你個大傻子") if [2, 3, 4]: print("你個大傻子") if {"阿里": '23'}: print("你個大傻子")
上面這些值都爲True 都會執行 你個大傻子
0 空值 None 三種爲隱式的false類型
if 0: print("你個傻子") else: print("你不是個傻子") if []: print("你個傻子") else: print("你不是個傻子") if {}: print("你個傻子") else: print("你不是個傻子") if None: print("你個傻子") else: print("你不是個傻子")
以上這些都會判斷爲false 執行 你不是個傻子 這句話。
淺層copy 對於淺層的copy 在可變數據類型上, 兩個數據之間是有關聯的 沒法徹底分開
list1 = [12, 34, ['alin']] list2 = list1.copy() print(id(list1[0]), id(list1[1]), id(list1[2])) #copy的兩個變量數據的內存地址同樣 print(id(list2[0]), id(list2[1]), id(list2[2])) list1[0] = 567 print(list1[0], id(list1[0]), list2[0], id(list2[0])) #對於不可變類型,會生成新的內存地址和值 copy的list2不受影響 list1[2][0] = 'alix' print(list1[2], id(list1[2]), list2[2], id(list2[2])) #對於可變類型, list1與list2是相互影響的,修改了list1 list2中的值也跟着變化,同時是在原有的內存空間修改的
140737487882240 140737487882944 1883384888064
140737487882240 140737487882944 1883384888064
567 1883382446576 12 140737487882240
['alix'] 2372841945600 ['alix'] 2372841945600
深層copy
import copy #引入包 list1 = [12, 34, ['alin']] list2 = copy.deepcopy(list1) # 深層copy print(id(list1[0]), id(list1[1]), id(list1[2])) print(id(list2[0]), id(list2[1]), id(list2[2])) #copy後 可變與不可變類型的開始不一樣了,可變數據類型有了新的內存地址 list1[0] = 567 print(list1[0], id(list1[0]), list2[0], id(list2[0])) list1[2][0] = 'alix' print(list1[2], id(list1[2]), list2[2], id(list2[2])) #可變與不可變類型 兩個變量都是完獨立開的 不受影響。
140737487882240 140737487882944 2121942939712
140737487882240 140737487882944 2121942907328
567 2121940498928 12 140737487882240
['alix'] 2121942939712 ['alin'] 2121942907328
總結:
淺copy 與深copy不一樣
淺copy沒有把可變類型與不可變類型區分開,當可變類型發生變化的時候,copy的兩個變量都會發生變化 ,沒有徹底區分開兩個變量。深層copy經過import copy 當copy的時候 可變類型與不可變類型的操做是不一樣的,不可變類型用的是原來的內存地址 可變類型會新開闢內存地址。