1.基本概念
1.1 對象
python中,一切皆對象 。每個對象都由標識(ID)瑟捣、類型(type)馋艺、及值(value)組成。
我們定義一個變量Name迈套,值為“JUEJING”
id(Name)函數(shù)查到Name的ID為2729105983472捐祠,這給就是對象“JUEJING”的地址
1.2 引用
python中,變量成為:對象的引用桑李。因為踱蛀,變量存儲的就是對象的地址。
變量通過地址來引用了“對象”
變量位于:棧內(nèi)存
對象位于:堆內(nèi)存
重點:
Python是動態(tài)類型語言
變量不需要顯式聲明類型贵白,根據(jù)變量引用的對象率拒,python解釋器自動獲取數(shù)據(jù)類型
Python是強類型語言
每個對象都要數(shù)據(jù)類型,只支持該類型支持的操作
舉個栗子:
1.3 棧內(nèi)存和堆內(nèi)存
2.字符串的內(nèi)存分布
2.1 聲明字符的內(nèi)存分布
給一個變量賦值字符串禁荒,賦值之前先會去內(nèi)存中的 堆內(nèi)存 查詢要賦值的字符串是否已經(jīng)存在
如果存在的話直接將該變量指向字符串的內(nèi)存地址
如果不存在的話猬膨,在堆內(nèi)存直接創(chuàng)建新的字符串并將內(nèi)存地址傳給變量
# 定義Name變量
Name = "JUEJING"
# 再定義Myname變量也為JUEJING
MyName = "JUEJING"
# 打印兩個變量,存儲是同一個數(shù)據(jù)
print(Name,MyName)
print(id(Name),id(MyName))
2.2 不可變數(shù)據(jù)類型內(nèi)存分布
Python標準語法中圈浇,不支持字符串直接修改內(nèi)部數(shù)據(jù)
# 定義Name變量
Name = "JUEJING"
# 修改Name變量
#Name = "Tome"
# 修改Name之后寥掐,Name會被引用到“Tom”新的對象里
print(Name)
print(id(Name))
前后兩次結(jié)果打印
————---------
JUEJING
4545145648
-------------
修改Name結(jié)果打印
-------------
Tome
4545145712
2.3 拼接字符串內(nèi)存分布
字符串直接通過引號聲明賦值,會在靜態(tài)區(qū)分配內(nèi)存創(chuàng)建數(shù)據(jù)
字符串通過拼接運算進行賦值磷蜀,會在堆內(nèi)存中完成運算處理結(jié)果的內(nèi)存分配
# 定義h1,h2,h3,h4變量
h1 = "hello" #4545145776
h2 = "JUEJING" # 4545145904
h3 = "helloJUEJING"
h4 = h1+h2
print(id(h3)) # 4545146160
print(id(h4)) # 4545146032
總結(jié)
python字符串內(nèi)存分配情況召耘,最核心的部分是棧內(nèi)存和堆內(nèi)存理解,后續(xù)會再次有更深入的學(xué)習(xí)
好啦褐隆,以上是關(guān)于python字符串的內(nèi)存原理講解污它,歡迎大佬們指正
我是學(xué)習(xí)python小白,盆友圈的小可愛庶弃,下期見~