網(wǎng)站首頁 編程語言 正文
一.可變類型與不可變類型的特點
1.不可變數(shù)據(jù)類型
不可變數(shù)據(jù)類型在第一次聲明賦值聲明的時候, 會在內(nèi)存中開辟一塊空間, 用來存放這個變量被賦的值,? 而這個變量實際上存儲的, 并不是被賦予的這個值, 而是存放這個值所在空間的內(nèi)存地址, 通過這個地址, 變量就可以在內(nèi)存中取出數(shù)據(jù)了. 所謂不可變就是說, 我們不能改變這個數(shù)據(jù)在內(nèi)存中的值, 所以當我們改變這個變量的賦值時, 只是在內(nèi)存中重新開辟了一塊空間, 將這一條新的數(shù)據(jù)存放在這一個新的內(nèi)存地址里, 而原來的那個變量就不在引用原數(shù)據(jù)的內(nèi)存地址而轉(zhuǎn)為引用新數(shù)據(jù)的內(nèi)存地址了.
舉例子:
>>> x = 18
>>> id(x)
4497811200
>>> id(18)
4497811200
>>> x = 19
>>> id(x)
4497811232
>>> id(18)
4497811200
>>> y = 18
>>> id(y)
4497811200
>>>
?一開始x = 18,開辟一塊地址為4497811200的內(nèi)存,即18對應的地址為4497811200,后來x = 19 ,重新開辟一塊地址為4497811232的內(nèi)存來放19,可以看到不變的意思是指18,和19在內(nèi)存中的地址不會改變,將18賦值給y時,y指向的地址即為4497811200。
2.可變數(shù)據(jù)類型
結(jié)合不可變數(shù)據(jù)類型,可變數(shù)據(jù)類型就很好理解來,可變數(shù)據(jù)類型是指變量所指向的內(nèi)存地址處的值是可以被改變的。
>>> x = [1,2,3]
>>> id(x)
4501838920
>>> y = [1,2,3]
>>> z = [1,2,3]
>>> id(y)
4501838600
>>> id(z)
4501838664
從另外一個角度來看:
可變類型:當該數(shù)據(jù)類型的對應變量的值發(fā)生了改變,那么它對應的內(nèi)存地址也會發(fā)生改變,對于這種數(shù)據(jù)類型,就稱不可變數(shù)據(jù)類型。
可變數(shù)據(jù)類型:當該數(shù)據(jù)類型的對應變量的值發(fā)生了改變,那么它對應的內(nèi)存地址不發(fā)生改變,對于這種數(shù)據(jù)類型,就稱可變數(shù)據(jù)類型。
#a的值改變了,a對應的內(nèi)存地址也改變了
>>> a=1
>>> id(a)
4497810656
>>> a = 2
>>> id(2)
4497810688
#直接對a操作,相當于拷貝了一份a的值,在其他內(nèi)存地址操作,a的值不變
>>> a+1
3
>>> id(a)
4497810688
>>> a
2
#b的值改變了,b對應的內(nèi)存地址不變,第一次給b賦值的時候,給b劃分一塊內(nèi)存空間,該空間就不變了
>>> b = [1,2,3]
>>> id(b)
4501839496
#直接對b操作,b的值改變,b指向的內(nèi)存空間不變
>>> b.append(4)
>>> id(b)
4501839496
>>> b
[1, 2, 3, 4]
>>>
二.哪些是可變類型哪些是不可變類型
不可變:Number(數(shù)字)、String(字符串)、Tuple(元組)。
#整型
a = 1
print(id(a), type(a))
a = 2
print(id(a), type(a))
# 4361254304 <class 'int'>
# 4361254336 <class 'int'>
#字符串
b = 'anne'
print(id(b),type(b))
b = 'anne1995'
print(id(b),type(b))
# 4363638744 <class 'str'>
# 4363684784 <class 'str'>
#元組
c1 = ['1','2']
c = (1,2,c1)
print(c,id(c),type(c))
c1[1] = 'djx'
print(c,id(c),type(c))
# (1, 2, ['1', '2']) 4363948248 <class 'tuple'>
# (1, 2, ['1', 'djx']) 4363948248 <class 'tuple'>
可以變:Set(集合)、List(列表)、Dictionary(字典)。
#集合
s = {1, 'd', '34', '1', 1}
print(s, type(s), id(s))
s.add('djx')
print(s, type(s), id(s))
# {1, '1', 'd', '34'} <class 'set'> 4401385256
# {1, '1', '34', 'd', 'djx'} <class 'set'> 4401385256
#列表
list = [1,'q','qwer',True]
print(list,type(list),id(list))
list.append('djx')
print(list,type(list),id(list))
# [1, 'q', 'qwer', True] <class 'list'> 4401113608
# [1, 'q', 'qwer', True, 'djx'] <class 'list'> 4401113608
#字典
tuple = (1)
dic = {1:2}
d = { tuple:1,'key2':'djx','key3':'li'}
print(d,type(d),id(d))
d['key4'] = 'haha'
print(d,type(d),id(d))
# {1: 1, 'key2': 'djx', 'key3': 'li'} <class 'dict'> 4401075976
# {1: 1, 'key2': 'djx', 'key3': 'li', 'key4': 'haha'} <class 'dict'> 4401075976
注意:此時元組的值發(fā)生了變化而內(nèi)存地址沒變,但我們依然稱元組為不可變類型,為什么呢?其實改的是元組中的列表,列表是可變類型,改變了值后地址依然不變。但是元組的定義就是不可變的,
元組被稱為只讀列表,即數(shù)據(jù)可以被查詢,但不能被修改。
原文鏈接:https://www.cnblogs.com/jiangfan95/p/11468721.html
相關推薦
- 2022-05-09 Go語言context上下文管理的使用_Golang
- 2022-05-12 Kotlin any/none/all 函數(shù)
- 2023-04-27 antd?upload上傳如何獲取文件寬高_React
- 2022-11-30 深入了解Golang?interface{}的底層原理實現(xiàn)_Golang
- 2022-08-31 React?SSR?中的限流案例詳解_React
- 2022-09-05 Shiro和Security的核心模塊以及兩者的區(qū)別
- 2023-04-07 C語言解決字符串中插入和刪除某段字符串問題_C 語言
- 2022-08-21 golang類型推斷與隱式類型轉(zhuǎn)換_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支