日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Python 變量?對象?引用?賦值?一個例子解釋清楚

來源: 責編: 時間:2024-01-26 09:05:20 203觀看
導讀哈嘍大家好,我是咸魚。前天有個小伙伴找到我,給了我一段 python 代碼:a = [1, 2]a[1] = aprint(a[1])然后問我為什么結果是 [1, [...]],我一看這個問題有意思,我說三言兩語解釋不清楚,寫篇文章到時候你看下吧,于是有了今天這

哈嘍大家好,我是咸魚。m4B28資訊網——每日最新資訊28at.com

前天有個小伙伴找到我,給了我一段 python 代碼:m4B28資訊網——每日最新資訊28at.com

a = [1, 2]a[1] = aprint(a[1])

然后問我為什么結果是 [1, [...]],我一看這個問題有意思,我說三言兩語解釋不清楚,寫篇文章到時候你看下吧,于是有了今天這篇文章。m4B28資訊網——每日最新資訊28at.com

在正式開始之前,讓我們先弄清楚一些概念。m4B28資訊網——每日最新資訊28at.com

m4B28資訊網——每日最新資訊28at.com

對象?變量?引用?賦值?

"Python 中一切皆對象",相信這句話大家在學習 Python 的時候都已經聽的耳朵起繭子了吧。m4B28資訊網——每日最新資訊28at.com

在 Python 中,所有的數據都是對象,包括基本數據類型(例如整數、浮點數、字符串等)以及用戶自定義的類型(類的實例等)。m4B28資訊網——每日最新資訊28at.com

而對象其實是內存中分配的一塊空間,用來存儲其值。每個對象都有一個唯一的標識符(id),可以通過 id() 函數獲取。m4B28資訊網——每日最新資訊28at.com

不但如此,每一個對象都具有兩個標準的頭部信息:m4B28資訊網——每日最新資訊28at.com

  • 類型標志符(Type Identifier):每個對象都有一個類型信息,可以通過 type() 函數獲取。
  • 引用計數器(Reference Counter): 引用計數器表示有多少個引用指向該對象,當引用計數降為零時,對象會被垃圾回收。( Python 也使用其他垃圾回收機制,例如循環垃圾回收器來處理引用環的情況。)

m4B28資訊網——每日最新資訊28at.com

在 Python 中,變量實際上是對象的【引用】,而不是對象本身的【存儲】。當我們執行賦值語句時,會自動建立變量和對象之間的關系,即引用。m4B28資訊網——每日最新資訊28at.com

變量就像是一個指針,【指向】內存中存儲對象的位置。m4B28資訊網——每日最新資訊28at.com

我們來看一個例子:m4B28資訊網——每日最新資訊28at.com

a = 1b = aa = a + 1

首先將  1 賦值于  a,即 a 指向了  1  這個對象。m4B28資訊網——每日最新資訊28at.com

m4B28資訊網——每日最新資訊28at.com

接著 b = a 則表示讓變量 b 也同時指向 1 這個對象。Python 的對象可以被多個變量所指向(引用)。m4B28資訊網——每日最新資訊28at.com

m4B28資訊網——每日最新資訊28at.com

最后執行 a = a + 1,在這里需要注意的是,Python 的基礎數據類型(例如整型(int)、字符串(string)等)是不可變的m4B28資訊網——每日最新資訊28at.com

所以,a = a + 1,并不是讓 a 的值增加 1,而是表示重新創建了一個新的值為 2 的對象,并讓 a 指向它。但是 b 仍然不變,仍然指向 1 這個對象。m4B28資訊網——每日最新資訊28at.com

因此最后的結果是,a 的值變成了 2,而 b的值不變仍然是 1。m4B28資訊網——每日最新資訊28at.com

m4B28資訊網——每日最新資訊28at.com

通過這個例子你可以看到,這里的 a 和 b,開始只是兩個指向同一個對象的變量而已,或者你也可以把它們想象成同一個對象的兩個名字。m4B28資訊網——每日最新資訊28at.com

簡單的賦值 b = a,并不表示重新創建了新對象,只是讓同一個對象被多個變量指向或引用。m4B28資訊網——每日最新資訊28at.com

為什么?

在了解了變量、對象、引用、賦值之后,我們回到一開始的例子。m4B28資訊網——每日最新資訊28at.com

a = [1, 2]a[1] = aprint(a[1])

這段代碼中創建了一個列表 a,其中包含兩個元素(1 和 2),然后 a[1] 被賦值為整個列表 a(a[1] = a),當你打印 a[1] 時,它實際上是指向列表 a 本身。m4B28資訊網——每日最新資訊28at.com

a = [1, <reference to a>]

這樣就會導致循環引用的問題。m4B28資訊網——每日最新資訊28at.com

m4B28資訊網——每日最新資訊28at.com

我們來分步驟解釋一下這個過程:m4B28資訊網——每日最新資訊28at.com

  • a 是一個包含兩個元素的列表:[1, 2]。
  • a[1] = a 將列表 a 的第二個元素設為 a,即a[1]實際上指向列表 a 本身,形成了一個循環引用
  • 當打印 a[1] 時,Python 發現這是一個特殊的情況,即這個元素是對列表本身的引用。為了避免無限循環,Python 會顯示 ...,表示引用已經進入了一個循環。因此看到的結果是 [1, [...]]。

那如何避免循環引用呢?可以使用淺拷貝或者深拷貝來解決。m4B28資訊網——每日最新資訊28at.com

我們用淺拷貝來試一下:m4B28資訊網——每日最新資訊28at.com

import copya = [1, 2]a[1] = copy.copy(a)print(a[1])# 結果是[1,2]

淺拷貝創建一個新的對象,然后將原始對象中的元素復制到新對象中。但是,如果原始對象的元素是可變對象(例如列表),那么淺拷貝只會復制對象的引用而不是對象本身。m4B28資訊網——每日最新資訊28at.com

就比如上面的例子:m4B28資訊網——每日最新資訊28at.com

  • a = [1, 2] 創建了一個列表 a,其中有兩個元素 1 和 2。
  • a[1] = copy.copy(a) 將列表 a 的第二個元素修改為對列表 a 的淺拷貝。
  • 打印 a[1],此時 a[1] 指向了新的對象 [1, 2]

本文鏈接:http://www.www897cc.com/showinfo-26-68339-0.htmlPython 變量?對象?引用?賦值?一個例子解釋清楚

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 突破性能瓶頸,C++代碼優化攻略

下一篇: C++中關于構造函數的幾個關鍵字

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 涿鹿县| 新竹县| 达拉特旗| 灵石县| 吉首市| 杭州市| 玛纳斯县| 麻江县| 修武县| 英吉沙县| 荥阳市| 托里县| 西宁市| 宿松县| 泸州市| 桦甸市| 宜州市| 宁强县| 保定市| 建宁县| 新乡市| 苍梧县| 天峨县| 龙川县| 濮阳县| 苍山县| 衡阳市| 惠安县| 舒兰市| 延长县| 左贡县| 新乡县| 寿阳县| 邵东县| 肥乡县| 茶陵县| 牡丹江市| 康马县| 如东县| 历史| 隆子县|