python的一切數(shù)據(jù)類型都是對象。但是python的對象分為不可變對象和可變對象。python的變量是引用,對python變量的賦值是引用去綁定該對象。
創(chuàng)新互聯(lián)服務項目包括富錦網(wǎng)站建設、富錦網(wǎng)站制作、富錦網(wǎng)頁制作以及富錦網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,富錦網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到富錦省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
可變對象的數(shù)據(jù)發(fā)生改變,例如列表和字典,引用不會更改綁定對象,畢竟本身就是用于增刪改查的,頻繁地產(chǎn)生新對象必然導致開銷巨大,只需要該對象內部變化就行;但對于綁定了不可變對象的引用,對象一旦改變就會使引用綁定新的對象。
這一點也會反應到函數(shù)的參數(shù)上。python的傳值方式是“傳對象”引用。python的函數(shù),形參實際上是引用,實參便是對象綁定到該引用上。本質是形參會被作為函數(shù)的局部變量,在開辟的函數(shù)的棧內存中被聲明。
簡要來講:
如果參數(shù)是數(shù),則類似值傳遞,
如果參數(shù)是列表和字典,則類似引用傳遞。
每個對象都會有個id, 可以用id()驗證以上說法:
這個函數(shù)的參數(shù)是列表,是可變對象。
9.3.4. 方法對象
通常,方法通過右綁定方式調用:
x.f()
在 MyClass 示例中,這會返回字符串 'hello world'。然而,也不是一定要直接調用方法。 x.f 是一個方法對象,它可以存儲起來以后調用。例如:
xf = x.f
while True:
print(xf())
會不斷的打印 hello world。
調用方法時發(fā)生了什么?你可能注意到調用 x.f() 時沒有引用前面標出的變量,盡管在 f() 的函數(shù)定義中指明了一個參數(shù)。這個參數(shù)怎么了?事實上如果函數(shù)調用中缺少參數(shù),Python 會拋出異常--甚至這個參數(shù)實際上沒什么用……
實際上,你可能已經(jīng)猜到了答案:方法的特別之處在于實例對象作為函數(shù)的第一個參數(shù)傳給了函數(shù)。在我們的例子中,調用 x.f() 相當于 MyClass.f(x) 。通常,以 n 個參數(shù)的列表去調用一個方法就相當于將方法的對象插入到參數(shù)列表的最前面后,以這個列表去調用相應的函數(shù)。
如果你還是不理解方法的工作原理,了解一下它的實現(xiàn)也許有幫助。引用非數(shù)據(jù)屬性的實例屬性時,會搜索它的類。如果這個命名確認為一個有效的函數(shù)對象類屬性,就會將實例對象和函數(shù)對象封裝進一個抽象對象:這就是方法對象。以一個參數(shù)列表調用方法對象時,它被重新拆封,用實例對象和原始的參數(shù)列表構造一個新的參數(shù)列表,然后函數(shù)對象調用這個新的參數(shù)列表。
python函數(shù)傳對象對性能有影響。在Python中,一切皆對象,Python參數(shù)傳遞采用的都是“傳對象引用”的方式。實際上,這種方式相當于傳值和傳引用的一種綜合。如果函數(shù)收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值,相當于通過“傳引用”來傳遞對象。如果函數(shù)收到的是一個不可變對象(比如數(shù)字、字符或者元組)的引用,就不能直接修改原始對象,相當于通過“傳值’來傳遞對象,此時如果想改變這些變量的值,可以將這些變量申明為全局變量。
python中,所有的元素都是對象,其中第一類對象的通用特性:可作為值傳遞,賦值給另一個對象;可以作為元素添加到集合對象中;可以作為參數(shù)傳遞給其他函數(shù);可以作為函數(shù)的返回值