最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python的對象傳遞與Copy函數(shù)使用詳解

 更新時間:2019年12月26日 17:05:07   作者:冬日暖陽_1992  
今天小編就為大家分享一篇Python的對象傳遞與Copy函數(shù)使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

1、對象引用的傳值或者傳引用

Python中的對象賦值實際上是簡單的對象引用。也就是說,當(dāng)你創(chuàng)建一個對象,然后把它賦值給另一個變量的時候,Python并沒有拷貝這個對象,而是拷貝了這個對象的引用。這種方式相當(dāng)于值傳遞和引用傳遞的一種綜合。如果函數(shù)收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值--相當(dāng)于通過“引用傳遞”來賦值。如果函數(shù)收到的是一個不可變變量(比如數(shù)字、字符串或者元祖)的引用,就不能直接修改原始對象--相當(dāng)于通過“值傳遞”來賦值。

先看一個數(shù)字傳遞的例子:

>>> def test(a):
...     print id(a)
...     a = a + 1
...     print id(a)
...     return a
...
>>> b =19
>>> id(b)
38896272
>>> c = test(b)
38896272
38896260
>>> id(b)
38896272
>>> b
19

id函數(shù)可以獲得對象的內(nèi)存地址.

很明顯從上面例子可以看出,將b變量作為參數(shù)傳遞給了test函數(shù),傳遞了b的一個引用,把b的地址傳遞過去了,所以在函數(shù)內(nèi)獲取的變量a的地址跟變量b的地址是一樣的,但是在函數(shù)內(nèi),對a進(jìn)行賦值運算,a的值從19變成了20,實際上19和20所占的內(nèi)存空間都還是存在的,賦值運算后,a指向20所在的內(nèi)存。而b仍然指向19所在的內(nèi)存,所以后面打印b,其值還是19.

另外,關(guān)于整數(shù)變量的id,所有在[-5,256]范圍內(nèi)的整數(shù),python是提前分配好空間放在數(shù)組里初始化好的,所以兩個變量如果是相同的小整數(shù),對象都是最開始初始化的那一個,所以兩個變量的id是一樣的。

所有在[-5,256]范圍外的整數(shù)的話,每次都會新建一個的,所以id會改變

>>> a = 256
>>> id(a)
43340980
>>> b = 256
>>> id(b)
43340980   # a和b的id相同
>>> a = 257
>>> id(a)
44621040
>>> b = 257
>>> id(b)
44620908   # a和b的id不同
>>> a = -5
>>> id(a)
43338160
>>> b = -5
>>> id(b)
43338160
>>> a = -6
>>> id(a)
44621184
>>> b = -6
>>> id(b)
44621112

再看一個列表傳遞的例子:

>>> def test(a):
...   print id(a)
...   a[0] = 100
...   print id(a)
...   return a
...
>>> b = [7,8,9,10]
>>> id(b)
46408088
>>> c = test(b)
46408088
46408088
>>> id(b)
46408088
>>> b
[100, 8, 9, 10]

從上面例子可以看出,將b變量作為參數(shù)傳遞給了test函數(shù),傳遞了b的一個引用,把b的地址傳遞過去了,所以在函數(shù)內(nèi)獲取的變量a的地址跟變量b的地址是一樣的,但是在函數(shù)內(nèi),對a進(jìn)行賦值運算,a[0]的值從7變成了100,但是a的id并沒有發(fā)生變化,還是和變量b的地址是一樣的,所以后面打印b,b[0]的值也從7變成了100.

2、關(guān)于可變變量和不可變變量:

這里的可變不可變,是指內(nèi)存中的那塊內(nèi)容(value)是否可以被改變

不可變變量:

number: int, float, str, 元組。--指它的部分(比如element,attribute不能改變)不能改變;并不是整體不可變。另外,Python所有變量皆對象。int也是一個對象。

>>> a = 10000
>>> id(a)
46573412
>>> a = 10000000
>>> id(a)
46573460   #數(shù)字變量重新賦值后,id發(fā)生了變化
>>> s = 'abc'
>>> s[1] = d   #字符串變量中的某一個元素不能進(jìn)行改變
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> id(s)
39103328
>>> s = 'ttt'
>>> id(s)    #字符串變量進(jìn)行重新賦值后,id發(fā)生了變化
46425368

從上面的例子中可以看出,數(shù)字變量、字符變量在重新賦值后,id都會發(fā)生變化,這是因為不可變變量的賦值是通過在內(nèi)存中新申請一塊區(qū)域,把新的值存儲到該區(qū)域,然后改變不可變變量的引用,指向新的內(nèi)存區(qū)域,從而改變了不可變變量的值。

可變變量

class, class instance;列表,dict,

例1.可變變量中元素的賦值

>>> list = [1,2,3]
>>> id(list)
45486568
>>> for i in list:
...   print id(i)
40207208
40207196
40207184
>>> list[0] = 0
>>> id(list)
45486568   # 變量的id并沒有發(fā)生改變
>>> for i in list:
...   print id(i)
40207220    # 該元素的id發(fā)生了改變
40207196
40207184
例2.可變變量的賦值
>>> list = [1,2,3]
>>> id(list)
43783392
>>> list =[2,3,5] 
>>> id(list)  # 該變量的id發(fā)生了改變
44454296

從上面的例子可以看出,列表中的元素重新賦值,整個列表的id不會發(fā)生改變,但是該元素的id會發(fā)生該生。因為列表中存儲的其實是對各個元素的引用,所以對該元素賦值的結(jié)果就是元素的引用發(fā)生了改變。

總之,無論是可變變量還是不可變變量,只要對整個變量進(jìn)行賦值,Python都在內(nèi)存中新申請一塊區(qū)域,把新的值存儲到該區(qū)域,然后改變不可變變量的引用,指向新的內(nèi)存區(qū)域;如果可變變量中的元素進(jìn)行賦值,支隊導(dǎo)致該元素的變化,不會導(dǎo)致父對象的變化。

3、 深拷貝 Vs 淺拷貝

copy.copy() 淺拷貝

copy.deepcopy() 深拷貝

淺拷貝是新創(chuàng)建了一個跟原對象一樣的類型,但是其內(nèi)容是對原對象元素的引用。這個拷貝的對象本身是新的,但內(nèi)容不是。如果原對象的元素包含不是基本數(shù)據(jù)結(jié)構(gòu),而是list、dict或者對象的話,那么原對象或者拷貝對象改變list、dict或者對象里面的內(nèi)容的話,會導(dǎo)致二者同時發(fā)生改變。

深拷貝則是對原對象的完全拷貝,包含對象里面的子對象的拷貝,因此拷貝對象和原對象二者是完全獨立,任何一方的改變對另外一方都不會產(chǎn)生任何的影響。

>>> import copy
>>> list = [1, 2, [3, 4]]
>>> copy_list = copy.copy(list)
>>> deepcopy_list = copy.deepcopy(list)
>>>
>>> id(list)
44454296
>>> id(copy_list)
44515736
>>> id(deepcopy_list)
44455736
>>>
>>> for k in list:
...   print id(k)
43338088 43338076 44430120
>>> for k in copy_list:
...   print id(k)
43338088 43338076 44430120  # copy對象的內(nèi)容和原對象完全一樣
>>> for k in deepcopy_list:
...   print id(k)
43338088 43338076 44457456  # deepcopy對象的內(nèi)容和原對象有區(qū)別:列表元素的id不一樣;數(shù)字元素id一樣,原因是所有相同數(shù)字的變量的引用都是一樣的。
>>> 
>>> list[2][0] = 30
>>> list
[1, 2, [30, 4]]
>>> copy_list
[1, 2, [30, 4]]   # 原對象的子對象中的元素發(fā)生改變后,會導(dǎo)致copy對象發(fā)生同樣的改變  
>>> deepcopy_list
[1, 2, [3, 4]]    #原對象的子對象中的元素發(fā)生改變后,不會導(dǎo)致deepcopy對象發(fā)生同樣的改變

以上這篇Python的對象傳遞與Copy函數(shù)使用詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python web框架學(xué)習(xí)筆記

    python web框架學(xué)習(xí)筆記

    這篇文章主要為大家分享了python web框架學(xué)習(xí)筆記,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Python中enumerate函數(shù)及其應(yīng)用詳解

    Python中enumerate函數(shù)及其應(yīng)用詳解

    在 Python 編程中,enumerate 函數(shù)是一個非常實用的工具,它能夠?qū)⒁粋€可迭代對象組合為一個索引序列,同時列出數(shù)據(jù)和數(shù)據(jù)下標(biāo),這種功能在處理列表、元組、字符串等可迭代對象時非常有用,尤其是在需要同時獲取每個元素的索引和值的情況下,需要的朋友可以參考下
    2025-01-01
  • python編程的核心知識點總結(jié)

    python編程的核心知識點總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python編程的核心知識點總結(jié)內(nèi)容,對此有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • 老生常談python的私有公有屬性(必看篇)

    老生常談python的私有公有屬性(必看篇)

    下面小編就為大家?guī)硪黄仙U刾ython的私有公有屬性(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • python自動化測試之setUp與tearDown實例

    python自動化測試之setUp與tearDown實例

    這篇文章主要介紹了python自動化測試之setUp與tearDown實例,其中setUp()方法中進(jìn)行測試前的初始化工作,并在tearDown()方法中執(zhí)行測試后的清除工作,setUp()和tearDown()都是TestCase類中定義的方法,需要的朋友可以參考下
    2014-09-09
  • Python基于OpenCV實現(xiàn)人臉檢測并保存

    Python基于OpenCV實現(xiàn)人臉檢測并保存

    這篇文章主要介紹了Python基于OpenCV實現(xiàn)人臉檢測并保存,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • numpy linalg模塊的具體使用方法

    numpy linalg模塊的具體使用方法

    這篇文章主要介紹了numpy linalg模塊的具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 詳解如何使用python打印出多樣字符

    詳解如何使用python打印出多樣字符

    當(dāng)你第一次進(jìn)入Python的世界里,學(xué)到的第一句代碼是不是print("Hello?World"),今天,讓我們一起來開啟探索print()的奇妙之旅,從最基礎(chǔ)的打印字符用法到讓它跳舞唱歌——動態(tài)顯示,讓我們一步步解鎖print()的各種技能吧,需要的朋友可以參考下
    2024-03-03
  • 一小時學(xué)會TensorFlow2之自定義層

    一小時學(xué)會TensorFlow2之自定義層

    這篇文章主要介紹了TensorFlow2之自定義層,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • python如何通過twisted搭建socket服務(wù)

    python如何通過twisted搭建socket服務(wù)

    這篇文章主要介紹了python如何通過twisted搭建socket服務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02

最新評論

祁阳县| 全州县| 延津县| 临夏市| 新闻| 右玉县| 闻喜县| 永德县| 禄丰县| 南京市| 连山| 永丰县| 三河市| 潮安县| 宜城市| 左云县| 九江市| 台北市| 清苑县| 宁都县| 布拖县| 镇原县| 天镇县| 澳门| 康保县| 龙游县| 泰兴市| 驻马店市| 彩票| 东丽区| 互助| 贺州市| 湘潭市| 泸州市| 松潘县| 乌鲁木齐市| 福鼎市| 惠安县| 华容县| 瑞安市| 博湖县|