Python可變與非可變數(shù)據(jù)類型示例詳解
Python可變與非可變數(shù)據(jù)類型
引用變量
在大多數(shù)編程語(yǔ)言中,值的傳遞通??梢苑譃閮煞N形式“值傳遞與引用(地址)傳遞”,但是在Python中變量的傳遞基本上都是引用(地址)傳遞。
變量在內(nèi)存底層的存儲(chǔ)形式
a = 10
第一步: 在計(jì)算機(jī)內(nèi)存中創(chuàng)建一個(gè)數(shù)值為10(占用一塊內(nèi)存空間)
第二步: 在??臻g中聲明一個(gè)變量,如a
第三步: 把數(shù)值10的內(nèi)存地址賦予給變量a,形成所謂的"引用關(guān)系"

變量的引用關(guān)系
使用內(nèi)置方法id(),其參數(shù)就是要顯示的變量信息,id(變量名稱)查詢內(nèi)存地址
a = 10 print(id(a))
把一個(gè)變量賦予給另一個(gè)變量
a = 10 b = a print(id(a)) print(id(b))
運(yùn)行結(jié)果:

說(shuō)明: 由以上運(yùn)行結(jié)果可知, 當(dāng)我們把一個(gè)變量賦予給另外一個(gè)變量時(shí), 其兩者指向的內(nèi)存地址相同. 可知a和b指向了同一塊內(nèi)存空間,原理圖如下:

若b =a 以后, 改變了變量a的值, 變量是否會(huì)改變呢
a = 10 b = a a = 100 print(b) # 10 或 100 print(id(a)) print(id(b))
運(yùn)行結(jié)果:

原理圖:

總結(jié):不可變數(shù)據(jù)類型(數(shù)值)在賦值以后, 其中一個(gè)值的改變不影響另外一個(gè)變量,因?yàn)閮烧咧赶蚩臻g地址不同
可變和非可變數(shù)據(jù)類型
數(shù)據(jù)類型
Python中一共有7種數(shù)據(jù)類型: 數(shù)值(int整型, float浮點(diǎn)類型) , bool類型(True和False) , 字符串類型(str) , 元組(tuple) , 列表(list[1, 2, 3]) , 字典(dict {key:value}) , 集合(set {1, 2})
將以上7種數(shù)值類型分為兩大類型:可變類型 和 非可變類型
可變類型:內(nèi)存一旦固定,其值就不能發(fā)生改變
- 數(shù)值(int整型、float浮點(diǎn)類型)
- bool類型(True和False)
- 字符串類型(str)
- 元組(tuple 1,2,3)
**不可變類型:**內(nèi)存地址一旦固定,其值是可以發(fā)生改變
- 列表(list [1, 2, 3])
- 字典(dict {key:value})
- 集合(set {1, 2})
判斷數(shù)據(jù)類型是可變型還是非可變型
在Python中,可變類型與非可變類型主要是通過這個(gè)數(shù)據(jù)類型在內(nèi)存中的表現(xiàn)形式來(lái)進(jìn)行定義的
可變類型就是在內(nèi)存中,其內(nèi)存地址一旦固定,其變量的值是可以發(fā)生改變的
a = [1, 2, 3] print(id(a)) # 向內(nèi)存中追加新數(shù)據(jù) a.append(4) print(id(a))
運(yùn)行結(jié)果:

原理圖:

非可變類型就是在內(nèi)存中,內(nèi)存地址一旦固定,其變量的值就沒辦法發(fā)生任何改變了
a = 10 print(id(a)) a = 'hello' print(id(a))
運(yùn)行結(jié)果:

原理圖:

在函數(shù)中的應(yīng)用
可變類型
# 定義一個(gè)函數(shù)
def func(ls):
# 在函數(shù)內(nèi)部添加元素
ls.append('蘋果')
print(fruits)
# ['草莓', '梨', '香蕉', '西瓜', '蘋果']
# 定義一個(gè)全局變量
fruits = ['草莓', '梨', '香蕉', '西瓜']
# 調(diào)用函數(shù)
func(fruits)
# 在全局作用域內(nèi)打印列表
print(fruits)
# ['草莓', '梨', '香蕉', '西瓜', '蘋果']
可變類型在函數(shù)中,如果在全局或局部中對(duì)可變類型進(jìn)行增刪改操作, 其外部和內(nèi)部都會(huì)受到影響
不可變類型
# 定義一個(gè)函數(shù)
def func(num):
num += 1
print(num) # 11
# 定義一個(gè)全局變量
a = 10
# 調(diào)用函數(shù)
func(a)
# 在全局作用域中打印a
print(a) # 10
不可變類型在函數(shù)中,局部和全局的改變對(duì)外部和內(nèi)部都沒有任何影響
總結(jié)
到此這篇關(guān)于Python可變與非可變數(shù)據(jù)類型的文章就介紹到這了,更多相關(guān)Python可變與非可變數(shù)據(jù)類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 機(jī)器學(xué)習(xí)第一章環(huán)境配置圖解流程
機(jī)器學(xué)習(xí)是一類算法的總稱,這些算法企圖從大量歷史數(shù)據(jù)中挖掘出其中隱含的規(guī)律,并用于預(yù)測(cè)或者分類,更具體的說(shuō),機(jī)器學(xué)習(xí)可以看作是尋找一個(gè)函數(shù),輸入是樣本數(shù)據(jù),輸出是期望的結(jié)果,只是這個(gè)函數(shù)過于復(fù)雜,以至于不太方便形式化表達(dá)2021-11-11
對(duì)python中array.sum(axis=?)的用法介紹
今天小編就為大家分享一篇對(duì)python中array.sum(axis=?)的用法介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-06-06
TensorFlow MNIST手寫數(shù)據(jù)集的實(shí)現(xiàn)方法
MNIST數(shù)據(jù)集中包含了各種各樣的手寫數(shù)字圖片,這篇文章主要介紹了TensorFlow MNIST手寫數(shù)據(jù)集的實(shí)現(xiàn)方法,需要的朋友可以參考下2020-02-02
深入理解Python虛擬機(jī)中字典(dict)的實(shí)現(xiàn)原理及源碼剖析
這篇文章主要介紹了在?cpython?當(dāng)中字典的實(shí)現(xiàn)原理,在本篇文章當(dāng)中主要介紹在早期?python3?當(dāng)中的版本字典的實(shí)現(xiàn),現(xiàn)在的字典做了部分優(yōu)化,希望對(duì)大家有所幫助2023-03-03
python利用JMeter測(cè)試Tornado的多線程
這篇文章主要介紹了python利用JMeter測(cè)試Tornado的多線程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
純numpy數(shù)值微分法實(shí)現(xiàn)手寫數(shù)字識(shí)別
本文主要介紹了純numpy數(shù)值微分法實(shí)現(xiàn)手寫數(shù)字識(shí)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Python map及filter函數(shù)使用方法解析
這篇文章主要介紹了Python map及filter函數(shù)使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08

