亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 關(guān)于值傳遞,引用傳遞,不可變對象,可變對象的疑問 [打印本頁]

作者: chenxin6676    時間: 2014-12-16 18:41
標(biāo)題: 關(guān)于值傳遞,引用傳遞,不可變對象,可變對象的疑問

def ChangeInt(a):
    a=10
b=2
ChangeInt(b)
print b # ->2

def ChangeList(a):
    a[0]=10
b=[2]
ChangeList(b)
print b # ->[10]


def ChangeList(a):
    a=[10]
b=[2]
ChangeList(b)
print b # ->[2]

以上拋開基本概念,僅僅從內(nèi)存角度來理解,如何理解呢? 費(fèi)解了兩天了,感覺還是迷糊...
不勝感激...
作者: 路人賈    時間: 2014-12-16 21:55
本帖最后由 路人賈 于 2014-12-16 22:10 編輯

函數(shù)的參數(shù)是通過賦值進(jìn)行對象的傳遞的,函數(shù)能夠改變傳入的可變對象。整數(shù)和字符串屬于不可變對象,列表和字典屬于可變對象

前兩個應(yīng)該是容易理解的,第三個的話,在函數(shù)中對a進(jìn)行賦值,并不是對可改變對象進(jìn)行改變,而是創(chuàng)建了新的列表對象,并將新的列表對象賦值給了a,但是由于作用域的關(guān)系,這里的a是一個新的變量,不同于函數(shù)外面的a,所以函數(shù)返回后,a并沒有改變。
以上是個人理解,供樓主參考,如有錯誤,歡迎指正
作者: chenxin6676    時間: 2014-12-17 10:47
回復(fù) 2# 路人賈


    我暫時的理解如下,還找不到確鑿的資料說明,只是自己試驗(yàn)的結(jié)果,不知道是否正確:

def ChangeInt(a):
    a=10
b=2
ChangeInt(b)
print b   # ->2
翻譯為非函數(shù)的樣子:
b=2
a=b     #a的內(nèi)存地址跟b是一樣的,說明這里是內(nèi)存地址拷貝,因此賦值可以理解為指針指向
a=10   #將a指向了新創(chuàng)建的10對象,a的內(nèi)存地址發(fā)生了改變.
print b

def ChangeList(a):
    a[0]=10
b=[2]
ChangeList(b)
print b   # ->[10]
翻譯為非函數(shù):
b=[2]
a=b         #a的內(nèi)存地址跟b是一樣的,說明這里是內(nèi)存地址拷貝,因此賦值可以理解為指針指向
a[0]=10   #將a指向的列表的第一個元素值指向內(nèi)存新創(chuàng)建的10對象,a的內(nèi)存地址沒有改變,仍然跟b的內(nèi)存地址一致.
print b

def ChangeList(a):
    a=[10]
b=[2]
ChangeList(b)
print b   # ->[2]
翻譯為非函數(shù):
b=[2]
a=b         #a的內(nèi)存地址跟b是一樣的,說明這里是內(nèi)存地址拷貝,因此賦值可以理解為指針指向
a=[10]     #重新創(chuàng)建了一個新的列表,a指向這個新列表,a的內(nèi)存地址發(fā)生了改變.
print b

總結(jié)以上3個例子,可以理解為:
1.python中的賦值"="語句,可以理解為指針的指向.
2.由于指針指向問題,故才衍生出"作用域"的概念,而不是因?yàn)橛凶饔糜虻?quot;人為限制"造成的以上結(jié)果,是吧?!
3.注意區(qū)分可變對象與不可變對象的區(qū)別.list,dict,int,char,tuple...
4.以此也推出了值傳遞與引用傳遞的概念,可以統(tǒng)一理解為python中都是引用傳遞.

作者: 路人賈    時間: 2014-12-17 11:10
你可以看看learning python這本書,有中文版的,會對理解這些有很大幫助,我也是剛接觸python,理解不是很透徹,回復(fù) 3# chenxin6676


   




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2