# 變量 a = [1, 2, 3, 4] # 定義一個變量 type = 1 print(type) type(1) # 此時的type是1 至關因而1(1) 所以int 不是可調用的 # 輸出結果 1 TypeError: 'int' object is not callable
int str tuple
不可改變list set dict
可改變# 值類型 a = 1 b = a a = 3 print(a) print(b) # 引用類型 list1 = [1, 2, 3, 4] list2 = list1 list1[1] = '2' print(list1) print(list2) # 輸出結果 3 1 [1, '2', 3, 4] [1, '2', 3, 4]
上述值類型和引用類型要進行區分,其中值類型會常見一塊新的內存空間來存儲,對於引用類型僅僅是一個指針,指向的仍是同一個內存區域python
string = 'hello' id(string) # id方法能夠展現出來某個變量在內存中的地址 string = string + ' python' id(string) # 能夠發現string已經發生了改變 指向了一個新的內存區域 string[0] = 'a' # str一旦定義 不可改變 # 輸出結果 57705504 12109688 'str' object does not support item assignment
list 是可變的對象,元組 tuple 是不可變的對象安全
因爲 tuple 不可變,因此使用 tuple 可使代碼更安全多線程
tuple 不可變的好處併發
相對於 list 而言,tuple 是不可變的,這使得它能夠做爲 dict 的 key,或者扔進 set 裏,而 list 則不行。app
tuple 放棄了對元素的增刪(內存結構設計上變的更精簡),換取的是性能上的提高:建立 tuple 比 list 要快,存儲空間比 list 佔用更小。因此就出現了「能用 tuple 的地方就不用 list」的說法。性能
多線程併發的時候,tuple 是不須要加鎖的,不用擔憂安全問題,編寫也簡單多了。測試
# 不可修改值 a = [1, 2, 3] print(id(a)) print(hex(id(a))) a[0] = '1' print(id(a)) a= (1, 2, 3) a[0] = '1' # error # append 操做 b = [1, 2, 3] b.append(4) print(b) c = (1, 2, 3) c.append(4) # tuple類型沒有append的方法 # 輸出結果 69249416 0x420a988 69249416 'tuple' object does not support item assignment [1, 2, 3, 4] 'tuple' object has no attribute 'append'
+ - * / 除以 獲得的都是float // 整除 向下取整 % 求餘 ** 次方 2**3 2的三次方
= += *= /= //= %= **= # 注意 python中沒有++ -- 運算符
== # 對於number類型來講 == 判斷是相等的 != > < >= <= # 返回的是一個bool類型 d = 1 d+=d>=1 print(d) # 2 # == 的特殊性 a = 0 b = False print(a == b) # True
and or not 返回的都是bool類型 ''' 邏輯短路原則 and 第一個爲真 那麼返回第二個;若是第一個爲假,返回第一個 or 第一個爲假,那麼返回第二個;若是第一個爲真,返回第一個 同時要注意 基本類型 和 True False的轉化 '''
判斷一個元素是否在另外的一組元素當中線程
in not in # 成員運算符能夠在字符串、列表、元祖、集合、字典中進行應用,返回結果爲布爾類型 b = 'c' print(b in {'c':1}) # 輸出結果 True # 字典判斷的是key是否在字典中
is not # 若是兩個變量取值相等,則is返回True a = 1 b = 2 a is b # False b = 1 a is b # True # is和 == 的區別 ''' == 表示的是值是否相等 is 表示的是所指向的內存地址是否相等 ''' a = 1 b = 1.0 a == b # True a is b # False # 思考題目 a = {1,2,3} b = {2,1,3} a == b # True 集合是無序的 a is b # False 因爲是引用類型 所以表示的是兩個集合 能夠用id()測試 c = (1,2,3) d = (2,1,3) c == d # False 元組屬於序列 它是無序的 c is d # False 雖然是值類型 由於值類型是兩個值 所以內存地址也不一樣
# 判斷方法一 a = 1 type(a) == int # True 不推薦使用 不能判斷變量的子類是否爲該類型 # 判斷方法二 isinstance(a,str) # False isinstance(a,(int,str,float)) # 這個方法的第二個參數能夠接受一個元組,那麼就判斷a是否爲元組中的任意一種 True # 注意說明: 對象的三個特徵:id value type
都是把數當作二進制進行運算 & 按位與 | 按位或 ^ 按位異或 相同爲0 相反爲1 - 按位取反 << 左移運算符 >> 右移運算符