詳解Python直接賦值,深拷貝和淺拷貝_python

來源:腳本之家  責任編輯:小易  

先將 a1,a2.a12 放進一個以月份為key的字典中,然后通過循環data 放進相應的 list 中,例如下面代碼:coding=utf-8定義 12 個 Lista1=[]a2=[]a3=[]a4=[]a5=[]a6=[]a7=[]a8=[]a9=[]a10=[]a11=[]a12=[]將 12 個 List 放進一個字典a={ 1:a1,2:a2,3:a3,4:a4,5:a5,6:a6,7:a7,8:a8,9:a9,10:a10,11:a11,12:a12 }data=[1,2,3,4,3,4,12,11,9,7,5,6,7,8]for item in data:a[item].append(item)print a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12www.anxorj.tw防采集請勿采集本網。

直接賦值: 對象的引用,也就是給對象起別名

對象調用方法時,實際上是通過類調用的 a=muffedcalculator() a.calc(expr) 實際上是這樣調用的 muffledcalculator.calc(a,expr) 這樣self 就是 a,python隱含地把a 傳進方法 替代了self,就成了

淺拷貝: 拷貝父對象,但是不會拷貝對象的內部的子對象。

對象調用方法時,實際上是通過類調用的 a=muffedcalculator() a.calc(expr) 實際上是這樣調用的 muffledcalculator.calc(a,expr) 這樣self 就是 a,python隱含地把a 傳進方法 替代了self,就成了

深拷貝: 拷貝父對象. 以及其內部的子對象

a,b,c,d=list1 這種方式只有當左邊的操作數個數和list1長度相同時,才可以這么做,不然不報錯. 我們假設我們有一個list對象List,它的長度足夠長,想把它從下標i開始的k個元素賦給k個元素,可以這么做

在之前的文章中,提到可變對象和不可變對象,接下來也是以這兩者的區別進行展開

第二種、反向的使用先專聲明一個列表變量,然后在列表中存儲表示變量名字的字符串,最后實用locals映射屬這個變量,并給變量賦值。參考一個簡單的例子,代碼如下: var=123445 s=locals()['var'] s2=vars

直接賦值

>>>shoplist=['apple','mango','carrot','換言之列表直接賦值,只是多了一個引用;slice()方法會將范圍內列表復制一個出來,并分本新地址變量,與原來的無關了;這在官方文檔的介紹中有說明。

對于可變對象和不可變對象,將一個變量直接賦值給另外一個變量,兩者 id 值一致,其實本質上是將變量量綁定到對象的過程.

>>> a=1>>> b=a>>> id(a) == id(b)True>>> c="string">>> d=c>>> id(c) == id(d)True>>> e=[1,2,3]>>> f=e>>> id(e)==id(f)True

關于修改新變量的值,對原有變量會產生的影響,在可變對象和不可變對象 中也做了講述,這里通過幾個例子,重新溫習一下

不可變對象

>>> x=1>>> y=x>>> id(x)==id(y)True>>> id(1)==id(y)True>>>>>> id(x)1500143776>>> y=y+1>>> y2>>> x1>>> id(x)==id(y)False>>> id(y)1500143808>>> id(x)1500143776

對于不可變對象,修改賦值后的新變量,不會對原有變量造成任何影響.為什么出現這種現象呢?因為不可變對象一旦創建之后就不允許被改變.后面對 y 進行的操作,其實是重新創建一個對象并綁定的結果:

可變對象

>>> m=[1,2,3]>>> n=m>>> id(n)==id(m)True>>> id(m)1772066764488>>> id(n[0])1772066764656>>> n[0]=4>>> n[4, 2, 3]>>> m[4, 2, 3]>>> id(n)==id(m)True>>> id(m)1772066764488

對于可變對象,修改賦值后的變量,會對原有的變量造成影響,會導致其 value 值的改變,但是其id 值保持不變

從上圖不難看出,這個時候的 id(n[0]) 的值,和未修改前的 id值應該不一樣,可以輸出看一下

>>>id(n[0])1772066764752 # 最初沒有修改前是 1772066764656

n[0] 修改前后為什么 id 值出現改變呢? 首先需要明確一點 n[0] 綁定的是一個不可變對象,在文章的最初提到,不可變對象一旦創建就不允許修改.顯然對 n[0] 進行修改,不能在綁定對象的內存上進行修改,那如何實現重新賦值呢?只能創建一個新的對象 4 ,然后將 n[0] 綁定到新的對象

淺拷貝和深拷貝

先看一下官方文檔的定義

The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or

class instances).

A shallow copy constructs a new compound object and then (to the

extent possible) inserts the same objects into it that the

original contains.

A deep copy constructs a new compound object and then, recursively,inserts copies into it of the objects found in the original.

從文檔中不難看出,上面提到深拷貝和淺拷貝兩者區別在于在復合對象,那接下來也只討論復合對象.

淺拷貝

注意到官方文檔也提到對淺拷貝和深拷貝的定義,從上文中不難看出,淺拷貝構建一個復合對象,然后將原有復合對象包含的對象插入到新的復合對象中

從上圖不難看出,淺拷貝后,新復合對象包含的對象(可變或者不可變)的 id 值和原有對象包含的對象的 id 值相同

看一下具體例子:

>>> import copy>>> a=[1,2,[3,4]]>>> b=copy.copy(a)>>> id(b[0])==id(a[0])True>>> id(b[2])==id(a[2])True>>> id(b[2][0])==id(a[2][0])True

現在讓我們試著修改一下淺拷貝后的 b 的值,在修改前,可以先思考一下,如果修改 b[0] 可能會發生什么?

由于 b[0] = 1,很顯然 1 屬于不可變對象,那么根據對不可變變量修改的規則,則 b[0] 會綁定到新的變量上,而 a[0] 的由于沒有修改,則保持不變,真的是這樣嗎?讓我們驗證一下

>>> b[0]=5>>> b[5, 2, [3, 4]]>>> a[1, 2, [3, 4]]

接下來我們要嘗試修改一下 b[2],由于 b[2] 綁定的對象是 list,屬于可變對象,按照上面說的可變對象修改的規則,則修改后的 b[2]id 值保持不變,但是其 value 值會發生改變. 同樣的讓我們通過例子驗證一下

>>> id(b[2])4300618568>>> b[2][0]=6>>> id(b[2])4300618568>>> b[5, 2, [6, 4]]>>> a[1, 2, [6, 4]]

由于 b[2]a[2] 綁定同一個可變對象,很顯然對 b[2] 的修改同樣會映射到 a[2]

深拷貝

深拷貝構建一個復合對象,然后遞歸的將原有復合包含的對象的副本插入到新的復合對象中

若上圖所示,深拷貝后,新的復合對象包含的對象,若對象為不可變對象,則 id 值保持不變,若對象為可變對象,則 id 值發生改變

看一個例子:

>>> import copy>>> a=[1,2,[3,4]]>>> b=copy.deepcopy(a)>>> id(b[0])==id(a[0])True>>> id(b[2])==id(a[0])False>>> id(b[2][0])==id(a[2][0])True

接下來讓我們修改一下變量 b,這里就不在修改不可變對象 b[0]b[1] 了,因為結果很明顯,對 a 不會產生任何影響,我們來修改 b[2],那么修改 b[2] 會對 a[2] 產生影響嗎?很明顯答案是不會,因為深拷貝就相當于克隆出了一個全新的個體,兩者不再有任何關系

>>> b[2][0]=5>>> b[1, 2, [5, 4]]>>> a[1, 2, [3, 4]]

以上就是詳解Python直接賦值,深拷貝和淺拷貝的詳細內容,更多關于Python直接賦值,深拷貝和淺拷貝的資料請關注真格學網其它相關文章!

是指向同一個內存地址的,python的賦值是只是把變量的內存地址賦值給另一個變量,這一點可以使用python的內建方法id()來進行測試,對于你給的例子:我們假設'QH'這個字符串在內存中的地址是a,'LJQ'在內存中的地址是byou='QH'#讓you變量指向a地址me=you#讓me變量和you變量一樣指向a地址you='LJQ'#修改you變量,讓它指向到b地址print you#可想而知you指向的是b地址,所以它的值為'LJQ'print me#me指向的是a地址,所以它的值為'QH'輸出:LJQQH可以使用ID來加強對python的賦值機制的理解a='asdf'id(a)872552384b=aid(b)872552384a='haha'id(a)872552672id(b)872552384a'haha'b'asdf'內容來自www.anxorj.tw請勿采集。


  • 本文相關:
  • python 直接賦值和copy的區別詳解
  • python直接賦值、淺拷貝與深度拷貝實例分析
  • python的賦值、深拷貝與淺拷貝的區別詳解
  • 詳解python列表賦值復制深拷貝及5種淺拷貝
  • 深入淺析python中list的復制及深拷貝與淺拷貝
  • 對python中列表和數組的賦值,淺拷貝和深拷貝的實例講解
  • python 從subprocess運行的子進程中實時獲取輸出的例子
  • python畫圖--輸出指定像素點的顏色值方法
  • python解決網站的反爬蟲策略總結
  • python 中由 yield 實現異步操作
  • django rest framework 如何實現內置訪問頻率控制
  • idle下python文件編輯和運行操作
  • django文件存儲 默認存儲系統解析
  • win系統pyqt5安裝和使用教程
  • keras中的兩種模型:sequential和model用法
  • python二分法實現實例
  • 關于python中的賦值變量的問題
  • python對多個變量循環賦值
  • python中為什么有的函數可以直接用,有的就要賦值才能用呢
  • python 原來需要輸入值給數組怎么改成直接給數組賦值啊,就是弄成像圖二那樣的
  • python 類 賦值是否加括號的問題
  • python中構建了一個類,在定義了一個函數時為什么括號第一個self有什么用,為什么不能給他賦值
  • python中,如何將list中的各個值快速賦值給變量
  • python如何把輸出的字符串賦值給變量
  • 請教python通過切片為列表賦值是怎么在內存上體現的
  • Python中print不能直接打印帶賦值的變量嗎?
  • 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全vbsdos/bathtahtcpythonperl游戲相關vba遠程腳本coldfusionruby專題autoitseraphzonepowershelllinux shellluagolangerlang其它首頁python 直接賦值和copy的區別詳解python直接賦值、淺拷貝與深度拷貝實例分析python的賦值、深拷貝與淺拷貝的區別詳解詳解python列表賦值復制深拷貝及5種淺拷貝深入淺析python中list的復制及深拷貝與淺拷貝對python中列表和數組的賦值,淺拷貝和深拷貝的實例講解python 從subprocess運行的子進程中實時獲取輸出的例子python畫圖--輸出指定像素點的顏色值方法python解決網站的反爬蟲策略總結python 中由 yield 實現異步操作django rest framework 如何實現內置訪問頻率控制idle下python文件編輯和運行操作django文件存儲 默認存儲系統解析win系統pyqt5安裝和使用教程keras中的兩種模型:sequential和model用法python二分法實現實例python入門教程 超詳細1小時學會python 列表(list)操作方法詳解python 元組(tuple)操作詳解python 字典(dictionary)操作詳解pycharm 使用心得(一)安裝和首python strip()函數 介紹pycharm 2020最新永久激活碼(附python 中文亂碼問題深入分析python中使用xlrd、xlwt操作excepython科學計算環境推薦——anac使用python寫的opencv實時監測和解析二維python批量將圖片灰度化的實現代碼python實現多條件篩選目標數據功能【測試pyhton中單行和多行注釋的使用方法及規范python如何爬取個性簽名python 在字符串中加入變量的實例講解python3 dict ndarray 存成json,并保留原深入淺析python中join 和 split詳解(推薦python(tornado)模擬登錄小米搶手機python松散正則表達式用法分析
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.anxorj.tw All Rights Reserved
    陕西快乐10分下载