Python動(dòng)態(tài)類型實(shí)現(xiàn)原理及過程解析
在python中,我們使用變量時(shí),并沒有聲明變量的存在和類型。類型是在運(yùn)行過程中自動(dòng)決定的。
a = 3
python將會(huì)執(zhí)行三步去完成上面這個(gè)請(qǐng)求。
1.創(chuàng)建一個(gè)對(duì)象代表3
2.創(chuàng)建一個(gè)變量a,如果a未創(chuàng)建。
3.將變量a與對(duì)象3相連接。
可以將變量a看作對(duì)象3的一個(gè)引用。
a = 3
b = a
多個(gè)變量可以指向同一個(gè)對(duì)象,在Python中叫共享引用。
Python在每個(gè)對(duì)象中保持了一個(gè)計(jì)數(shù)器,用于記錄當(dāng)前指向該對(duì)象的引用的數(shù)目,一旦計(jì)數(shù)器被設(shè)置為0,該對(duì)象的內(nèi)存空間就會(huì)自動(dòng)回收。
原處修改對(duì)象
由于共享引用的存在,有一些對(duì)象和操作會(huì)在原處修改對(duì)象。
Python中對(duì)象可分為可變類型對(duì)象和不可變類型對(duì)象。
可變對(duì)象:列表,字典
不可變對(duì)象:數(shù)字,字符串,元組
如果變量是不可變對(duì)象的引用,對(duì)變量名的修改不會(huì)影響其他變量,而是直接連接到修改的對(duì)象。
a = 3
b = a
print(a)# 3
print(b)# 3a = 4
print(a)# 4
print(b)# 3
如果變量是可變對(duì)象的引用,對(duì)變量名的修改會(huì)影響其他變量。
a = [1,2,3]
b = a
print(a)# [1, 2, 3]
print(b)# [1, 2, 3]a[0] = 4
print(a)# [4, 2, 3]
print(b)# [4, 2, 3]
拷貝
所以當(dāng)你需要?jiǎng)?chuàng)建一個(gè)與原列表一樣同時(shí)又獨(dú)立于原列表的列表時(shí),可以使用拷貝。
下面介紹最常用的兩種。
a = [1,2,3]
b = a[:]
print(a)# [1, 2, 3]
print(b)# [1, 2, 3]a[0] = 4
print(a)# [4, 2, 3]
print(b)# [1, 2, 3]
此時(shí)b引用的是a所引用的對(duì)象的拷貝。a,b指向不同的內(nèi)存區(qū)域。
在字典和集合中,無法使用這種方法。
可以使用標(biāo)準(zhǔn)庫中的copy模塊
import copy
a = [1,2,[3]]
b = copy.copy(a)# 淺拷貝
c = copy.deepcopy(a)# 深拷貝a[0] = 0
a[-1].append(4)print(a)# [0, 2, [3, 4]]
print(b)# [1, 2, [3, 4]]
print(c)# [1, 2, [3]]
淺拷貝中可變對(duì)象中嵌套的可變對(duì)象的引用還是原來的引用。
深拷貝可以拷貝嵌套的對(duì)象結(jié)構(gòu)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python動(dòng)態(tài)強(qiáng)類型解釋型語言原理解析
- Python動(dòng)態(tài)語言與鴨子類型詳解
- python動(dòng)態(tài)性強(qiáng)類型用法實(shí)例
- python進(jìn)階教程之動(dòng)態(tài)類型詳解
- Python實(shí)現(xiàn)爬取網(wǎng)頁中動(dòng)態(tài)加載的數(shù)據(jù)
- Python調(diào)用.net動(dòng)態(tài)庫實(shí)現(xiàn)過程解析
- Python繪制動(dòng)態(tài)水球圖過程詳解
- 基于Python繪制美觀動(dòng)態(tài)圓環(huán)圖、餅圖
相關(guān)文章
bool當(dāng)成函數(shù)參數(shù)錯(cuò)誤理解
經(jīng)常會(huì)在函數(shù)的參數(shù)里使用bool參數(shù),這會(huì)大大地降低代碼的可讀性2012-11-11Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之二叉堆
二叉堆是一種特殊的堆,其實(shí)質(zhì)是完全二叉樹。二叉堆有兩種:最大堆和最小堆。最大堆是指父節(jié)點(diǎn)鍵值總是大于或等于任何一個(gè)子節(jié)點(diǎn)的鍵值。而最小堆恰恰相反,指的是父節(jié)點(diǎn)鍵值總是小于任何一個(gè)子節(jié)點(diǎn)的鍵值2022-02-02struts2如何使用攔截器進(jìn)行用戶權(quán)限控制實(shí)例
本篇文章主要介紹了struts2如何使用攔截器進(jìn)行用戶權(quán)限控制實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05java的MybatisPlus調(diào)用儲(chǔ)存過程的返回?cái)?shù)據(jù)問題
這篇文章主要介紹了java的MybatisPlus調(diào)用儲(chǔ)存過程的返回?cái)?shù)據(jù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12java之a(chǎn)ssert關(guān)鍵字用法案例詳解
這篇文章主要介紹了java之a(chǎn)ssert關(guān)鍵字用法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Jmeter對(duì)接口測(cè)試入?yún)?shí)現(xiàn)MD5加密
這篇文章主要介紹了Jmeter對(duì)接口測(cè)試入?yún)?shí)現(xiàn)MD5加密,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08SpringMVC中請(qǐng)求參數(shù)的獲取方式
這篇文章主要為大家介紹了SpringMVC中請(qǐng)求參數(shù)的獲取方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05