成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
在 Python 中,變量實際上是對象的【引用】,而不是對象本身的【存儲】。當我們執行賦值語句時,會自動建立變量和對象之間的關系,即引用。

哈嘍大家好,我是咸魚。

前天有個小伙伴找到我,給了我一段 python 代碼:

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

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

在正式開始之前,讓我們先弄清楚一些概念。

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

"Python 中一切皆對象",相信這句話大家在學習 Python 的時候都已經聽的耳朵起繭子了吧。

在 Python 中,所有的數據都是對象,包括基本數據類型(例如整數、浮點數、字符串等)以及用戶自定義的類型(類的實例等)。

而對象其實是內存中分配的一塊空間,用來存儲其值。每個對象都有一個唯一的標識符(id),可以通過 id() 函數獲取。

不但如此,每一個對象都具有兩個標準的頭部信息:

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

在 Python 中,變量實際上是對象的【引用】,而不是對象本身的【存儲】。當我們執行賦值語句時,會自動建立變量和對象之間的關系,即引用。

變量就像是一個指針,【指向】內存中存儲對象的位置。

我們來看一個例子:

a = 1
b = a
a = a + 1

首先將  1 賦值于  a,即 a 指向了  1  這個對象。

接著 b = a 則表示讓變量 b 也同時指向 1 這個對象。Python 的對象可以被多個變量所指向(引用)。

最后執行 a = a + 1,在這里需要注意的是,Python 的基礎數據類型(例如整型(int)、字符串(string)等)是不可變的

所以,a = a + 1,并不是讓 a 的值增加 1,而是表示重新創建了一個新的值為 2 的對象,并讓 a 指向它。但是 b 仍然不變,仍然指向 1 這個對象。

因此最后的結果是,a 的值變成了 2,而 b的值不變仍然是 1。

通過這個例子你可以看到,這里的 a 和 b,開始只是兩個指向同一個對象的變量而已,或者你也可以把它們想象成同一個對象的兩個名字。

簡單的賦值 b = a,并不表示重新創建了新對象,只是讓同一個對象被多個變量指向或引用。

為什么?

在了解了變量、對象、引用、賦值之后,我們回到一開始的例子。

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

這段代碼中創建了一個列表 a,其中包含兩個元素(1 和 2),然后 a[1] 被賦值為整個列表 a(a[1] = a),當你打印 a[1] 時,它實際上是指向列表 a 本身。

a = [1, <reference to a>]

這樣就會導致循環引用的問題。

我們來分步驟解釋一下這個過程:

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

那如何避免循環引用呢?可以使用淺拷貝或者深拷貝來解決。

我們用淺拷貝來試一下:

import copy

a = [1, 2]
a[1] = copy.copy(a)
print(a[1])

# 結果是[1,2]

淺拷貝創建一個新的對象,然后將原始對象中的元素復制到新對象中。但是,如果原始對象的元素是可變對象(例如列表),那么淺拷貝只會復制對象的引用而不是對象本身。

就比如上面的例子:

  • a = [1, 2] 創建了一個列表 a,其中有兩個元素 1 和 2。
  • a[1] = copy.copy(a) 將列表 a 的第二個元素修改為對列表 a 的淺拷貝。
  • 打印 a[1],此時 a[1] 指向了新的對象 [1, 2]
責任編輯:趙寧寧 來源: 咸魚運維雜談
相關推薦

2025-05-28 02:00:00

AI智能體文本

2023-03-14 08:02:14

靜態路由動態路由設備

2009-06-18 15:53:37

Hibernate B

2009-06-11 14:48:48

jbpm工作流引擎jbpm例子

2024-01-08 13:40:00

并發安全? 數量

2023-11-06 13:55:59

聯合索引MySQ

2022-10-08 13:29:19

Pandasgroupby

2022-01-05 08:58:08

Python解釋器編程語言

2019-12-27 16:21:54

Python 開發編程語言

2018-01-02 09:44:37

2018-04-02 10:37:10

Linux命令size

2024-08-14 13:24:24

2021-07-09 06:11:37

Java泛型Object類型

2021-04-21 11:08:00

數據分析數據集Python

2023-04-20 13:59:01

Pythonwhile循環的

2021-04-20 11:40:47

指針類型CPU

2020-12-25 11:11:48

鴻蒙HarmonyOS應用開發

2024-01-31 08:16:38

IPythonPython解釋器

2025-03-03 08:40:00

JavaScriptthis開發

2023-01-05 18:14:32

淺拷貝深拷貝Python
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区 | 91精品国产综合久久婷婷香蕉 | 中文字幕免费在线 | 色婷婷av一区二区三区软件 | 韩国av一区二区 | 一区二区中文字幕 | 中文字幕动漫成人 | 中文字幕乱码一区二区三区 | 国产亚洲人成a在线v网站 | 91精品国产乱码久久久久久久久 | 久久国产电影 | 欧美日韩国产在线观看 | 亚洲成人一区二区 | 亚洲综合国产 | 久久久免费在线观看 | 一区福利视频 | 久久大| 亚洲精品国产第一综合99久久 | 日韩欧美综合 | 国产一二三视频在线观看 | 中文字幕的av | 日韩高清中文字幕 | 在线欧美亚洲 | 日韩一区二区三区在线视频 | 男女羞羞视频免费 | 日韩免费视频一区二区 | 性xxxxx | 久久久999国产精品 中文字幕在线精品 | 国产精品视频一区二区三区 | 一级毛片免费视频观看 | 国产精品久久久久久久久久久免费看 | 精品无码三级在线观看视频 | 国产高清在线观看 | 丁香五月网久久综合 | 亚洲精品国产一区 | 亚洲视频在线看 | 精品久久久久久久久久久久 | 精品欧美一区二区在线观看视频 | 性高朝久久久久久久3小时 av一区二区三区四区 | 亚洲九九精品 | 国产免费国产 |