python中、变量指向的对象可以发生变化吗_python中的引用传递,可变对象,不可变对象,list注意点...
python中的引用傳遞
首先必須理解的是,python中一切的傳遞都是引用(地址),無(wú)論是賦值還是函數(shù)調(diào)用,不存在值傳遞。
可變對(duì)象和不可變對(duì)象
python變量保存的是對(duì)象的引用,這個(gè)引用指向堆內(nèi)存里的對(duì)象,在堆中分配的對(duì)象分為兩類(lèi),一類(lèi)是可變對(duì)象,一類(lèi)是不可變對(duì)象。不可變對(duì)象的內(nèi)容不可改變,保證了數(shù)據(jù)的不可修改(安全,防止出錯(cuò)),同時(shí)可以使得在多線程讀取的時(shí)候不需要加鎖。
不可變對(duì)象(變量指向的內(nèi)存的中的值不能夠被改變)
當(dāng)更改該對(duì)象時(shí),由于所指向的內(nèi)存中的值不可改變,所以會(huì)把原來(lái)的值復(fù)制到新的空間,然后變量指向這個(gè)新的地址。python中數(shù)值類(lèi)型(int和float),字符串str,元組tuple都是不可變對(duì)象。
下面以int類(lèi)型為例簡(jiǎn)單介紹。
a = 1
print id(a) //40133000L,整數(shù)1放在了地址為40133000L的內(nèi)存中,a變量指向這個(gè)地址。
a += 1
print id(a) //40132976L,整數(shù)int不可改變,開(kāi)辟新空間存放加1后的int,a指向這個(gè)新空間。
可變對(duì)象(變量指向的內(nèi)存的中的值能夠被改變)
當(dāng)更改該對(duì)象時(shí),所指向的內(nèi)存中的值直接改變,沒(méi)有發(fā)生復(fù)制行為。python中列表list,字典dict,集合set都是可變對(duì)象。下面以list類(lèi)型為例簡(jiǎn)單介紹。
a = [1,2,3]
print id(a) //44186120L。
a += [4,5] //相當(dāng)于調(diào)用了a.extend([4])
print id(a) //44186120L,列表list可改變,直接改變指向的內(nèi)存中的值,沒(méi)開(kāi)辟新空間。
a = a + [7,8] //直接+和+=并不等價(jià),使用+來(lái)操作list時(shí),得到的是新的list,不指向原空間。
print id(a) //44210632L
引用傳遞后的改變
a = [1,2,3]
b = a
b[0] = 2 //由于list是可變對(duì)象,改變b時(shí)候會(huì)導(dǎo)致a的改變,a和b都是[2,2,3]
s = ‘a(chǎn)bc‘
s2 = s
s2 += ‘d‘ //由于str是不可變對(duì)象,s2是新建的對(duì)象,s2的修改不會(huì)影響s。s為‘a(chǎn)bc‘,s2為‘a(chǎn)bcd‘。
list注意點(diǎn)
a = [1,2,3]
b = a
a is b //True,因?yàn)榘匆脗鬟f,a和b存的地址(引用)是一樣的,改變b相當(dāng)于改變a。
b = a[:]
a is b //False,想使用list的值卻不想修改原list時(shí)可以使用[:]拷貝一份到新空間。
a =[ [0]*2 ]* 2 //以這種方式創(chuàng)建一個(gè)二維list,此時(shí)a為[[0,0],[0,0]]。
a[0] == a[1] //True,這種創(chuàng)建方法的機(jī)制是復(fù)制list,所以2個(gè)list其實(shí)是同一個(gè)list。
a[0][0] = 1 //改變第一個(gè)list時(shí)第二個(gè)list也改變,此時(shí)a為[[1,0],[1,0]]。
a[0] += [1] //改變第一個(gè)list時(shí)第二個(gè)list也改變,此時(shí)a為[[1,0,1],[1,0,1]]。
a[0] = [1,2] //a[0]指向創(chuàng)建的新list[1,2]。此時(shí)a[1]不變,a為[[1,2],[1,0,1]]。
總結(jié)
以上是生活随笔為你收集整理的python中、变量指向的对象可以发生变化吗_python中的引用传递,可变对象,不可变对象,list注意点...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JSP+Javabean+Servlet
- 下一篇: 【TL】【编码】瞬间移动-百度之星初赛(