国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入探究Python中變量的拷貝和作用域問題

2020-02-23 01:04:22
字體:
來源:轉載
供稿:網友

在 python 中賦值語句總是建立對象的引用值,而不是復制對象。因此,python 變量更像是指針,而不是數據存儲區域,

201555102817358.jpg (668×316)

 這點和大多數 OO 語言類似吧,比如 C++、java 等 ~
1、先來看個問題吧:

在Python中,令values=[0,1,2];values[1]=values,為何結果是[0,[...],2]?
 

>>> values = [0, 1, 2]>>> values[1] = values>>> values[0, [...], 2]

我預想應當是

[0, [0, 1, 2], 2]

但結果卻為何要賦值無限次?

可以說 Python 沒有賦值,只有引用。你這樣相當于創建了一個引用自身的結構,所以導致了無限循環。為了理解這個問題,有個基本概念需要搞清楚。

Python 沒有「變量」,我們平時所說的變量其實只是「標簽」,是引用。

執行

values = [0, 1, 2]

的時候,Python 做的事情是首先創建一個列表對象 [0, 1, 2],然后給它貼上名為 values 的標簽。如果隨后又執行

values = [3, 4, 5]

的話,Python 做的事情是創建另一個列表對象 [3, 4, 5],然后把剛才那張名為 values 的標簽從前面的 [0, 1, 2] 對象上撕下來,重新貼到 [3, 4, 5] 這個對象上。

至始至終,并沒有一個叫做 values 的列表對象容器存在,Python 也沒有把任何對象的值復制進 values 去。過程如圖所示: 

201555102850996.jpg (600×450)

 執行

values[1] = values

的時候,Python 做的事情則是把 values 這個標簽所引用的列表對象的第二個元素指向 values 所引用的列表對象本身。執行完畢后,values 標簽還是指向原來那個對象,只不過那個對象的結構發生了變化,從之前的列表 [0, 1, 2] 變成了 [0, ?, 2],而這個 ? 則是指向那個對象本身的一個引用。如圖所示:

201555102915614.jpg (600×450)

要達到你所需要的效果,即得到 [0, [0, 1, 2], 2] 這個對象,你不能直接將 values[1] 指向 values 引用的對象本身,而是需要吧 [0, 1, 2] 這個對象「復制」一遍,得到一個新對象,再將 values[1] 指向這個復制后的對象。Python 里面復制對象的操作因對象類型而異,復制列表 values 的操作是

values[:] #生成對象的拷貝或者是復制序列,不再是引用和共享變量,但此法只能頂層復制

所以你需要執行

values[1] = values[:]

Python 做的事情是,先 dereference 得到 values 所指向的對象 [0, 1, 2],然后執行 [0, 1, 2][:] 復制操作得到一個新的對象,內容也是 [0, 1, 2],然后將 values 所指向的列表對象的第二個元素指向這個復制二來的列表對象,最終 values 指向的對象是 [0, [0, 1, 2], 2]。過程如圖所示: 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 剑川县| 赤水市| 兴仁县| 奉新县| 方正县| 蛟河市| 五原县| 乌恰县| 竹北市| 越西县| 淮南市| 民勤县| 通河县| 嘉鱼县| 桃园县| 保定市| 青州市| 通山县| 渑池县| 成都市| 剑阁县| 会同县| 湖口县| 金坛市| 集安市| 全州县| 临沂市| 呼伦贝尔市| 深州市| 三门县| 革吉县| 江阴市| 永德县| 锡林浩特市| 阜康市| 马关县| 长丰县| 宜春市| 云霄县| 交城县| 乌恰县|