7.python 可變數據類型和不可變數據類型

  • 2020 年 3 月 12 日
  • 筆記

python數據類型分別有整數int / 浮點數float / 布爾值bool / 元組tuple / 列表list / 字典dict,其中數據類型分為兩個大類,一種是可變數據類型;一種是不可變數據類型,兩者有什麼區別呢?

一.關於記憶體

在講解python可變數據類型和不可變數據類型之前需要先普及一下記憶體相關的簡單知識!

在python編程的時候,程式碼中的變數實際上都是存儲在電腦記憶體中,當然這裡指的記憶體在電腦中是虛擬的,你看不見摸不著!每一個記憶體都有一個對應的記憶體地址,講到這裡需要再次介紹一個python內置函數id(),該函數可以用於獲取記憶體地址!獲取記憶體地址方法如下:

if __name__ == "__main__":         a = 10      b = 20      print("a的數據類型是:{} 地址:{}".format(type(a),id(a)))      print("b的數據類型是:{} 地址:{}".format(type(b), id(b)))

輸出結果:

a的數據類型是:<class 'int'> 地址:1994744256  b的數據類型是:<class 'int'> 地址:1994744576

分析下上面程式碼:定義了局部變數a和b,python會自動給局部變數分配記憶體,分別用來存放整數10和20,並通過內置函數id()獲取記憶體地址!關於記憶體這裡不做過多介紹,你需要記住的是:每一個記憶體都有一個一個對應的記憶體地址,分配的記憶體在程式結束時由系統自動回收!

二.可變數據類型和不可變數據類型

python數據類型分別有整數int / 浮點數float / 布爾值bool / 元組tuple / 列表list / 字典dict,這是python開發中最常用的數據類型!

1.可變數據類型和不可變數據類型區別

可變數據類型:當該數據類型對應的變數的值發生了變化時,如果它對應的記憶體地址不發生改變,那麼這個數據類型就是 可變數據類型。

不可變數據類型:當該數據類型對應的變數的值發生了變化時,如果它對應的記憶體地址發生了改變,那麼這個數據類型就是 不可變數據類型。

總結:可變數據類型更改值後,記憶體地址不發生改變;不可變數據類型更改值後,記憶體地址發生改變。

2.不可變數據類型

不可變數據類型:數值類型(int、float、bool)、string(字元串)、tuple(元組)

# !usr/bin/env python  # -*- coding:utf-8 _*-  """  @Author:何以解憂  @Blog(個人部落格地址): shuopython.com  @WeChat Official Account(微信公眾號):猿說python  @Github:www.github.com     @File:python_variable.py  @Time:2019/10/24 21:25     @Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!  """        #整形變數  a = 10  print("整形變數a修改之前地址:{}".format(id(a)))  a = 20  print("整形變數a修改之後地址:{}".format(id(a)))  print("***"*20)     #浮點數變數  a = 10.5  print("浮點數變數a修改之前地址:{}".format(id(a)))  a = 20.2  print("浮點數變數a修改之後地址:{}".format(id(a)))  print("***"*20)        #字元串變數  a = "hello"  print("字元串變數a修改之前地址:{}".format(id(a)))  a = "world"  print("字元串變數a修改之後地址:{}".format(id(a)))  print("***"*20)     #布爾值變數  a = False  print("布爾值a修改之前地址:{}".format(id(a)))  a = True  print("布爾值a修改之後地址:{}".format(id(a)))  print("***"*20)     #元組的數據不能修改,否則會報錯

輸出結果:

整形變數a修改之前地址:1994744256  整形變數a修改之後地址:1994744576  ************************************************************  浮點數變數a修改之前地址:2713286559088  浮點數變數a修改之後地址:2713286559136  ************************************************************  字元串變數a修改之前地址:2713269294224  字元串變數a修改之後地址:2713269272112  ************************************************************  布爾值a修改之前地址:1994252480  布爾值a修改之後地址:1994252448  ************************************************************

3.可變數據類型

可變數據類型:list(列表)、dict(字典)

#列表  a = list()  print("列表a修改之前地址:{}".format(id(a)))  a.append(20)  print("列表a修改之後地址:{}".format(id(a)))  a.append(False)  print("列表a修改之後地址:{}".format(id(a)))  a.append("hello")  print("列表a修改之後地址:{}".format(id(a)))  print("***"*20)     #字典  a = dict()  print("字典a修改之前地址:{}".format(id(a)))  a["name"]="zhangsan"  print("字典a修改之後地址:{}".format(id(a)))  a["age"]=18  print("字典a修改之後地址:{}".format(id(a)))  a["sing_dog"]=True  print("字典a修改之後地址:{}".format(id(a)))  print("***"*20)

輸出結果:

列表a修改之前地址:2067294579016  列表a修改之後地址:2067294579016  列表a修改之後地址:2067294579016  列表a修改之後地址:2067294579016  ************************************************************  字典a修改之前地址:2067294527992  字典a修改之後地址:2067294527992  字典a修改之後地址:2067294527992  字典a修改之後地址:2067294527992  ************************************************************

三.重點總結

1.不可變數據類型:數值類型(int、float、bool)、string(字元串)、tuple(元組)

2.可變數據類型:list(列表)、dict(字典)

3.可變數據類型更改值後,記憶體地址不發生改變;不可變數據類型更改值後,記憶體地址發生改變