成人免费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-11 14:48:48

jbpm工作流引擎jbpm例子

2009-06-18 15:53:37

Hibernate B

2024-01-08 13:40:00

并發安全? 數量

2023-11-06 13:55:59

聯合索引MySQ

2022-01-05 08:58:08

Python解釋器編程語言

2018-01-02 09:44:37

2021-07-09 06:11:37

Java泛型Object類型

2021-04-21 11:08:00

數據分析數據集Python

2024-08-14 13:24:24

2022-10-08 13:29:19

Pandasgroupby

2019-12-27 16:21:54

Python 開發編程語言

2024-01-31 08:16:38

IPythonPython解釋器

2025-03-03 08:40:00

JavaScriptthis開發

2018-04-02 10:37:10

Linux命令size

2023-04-20 13:59:01

Pythonwhile循環的

2023-01-05 18:14:32

淺拷貝深拷貝Python

2024-06-12 12:03:15

Python變量代碼

2017-03-28 20:35:12

MapReduce編程函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久www成人免费精品张筱雨 | 国产激情视频 | 久久久精品一区二区三区 | 韩日精品在线观看 | 自拍偷拍亚洲欧美 | 一区二区在线视频 | 91一区二区三区在线观看 | 91精品国产乱码久久久 | 亚洲激情一区二区三区 | 国产中文区二幕区2012 | 成人性生交大片免费看中文带字幕 | 欧美乱操 | 精品国模一区二区三区欧美 | 狠狠色综合久久婷婷 | 日韩在线资源 | 成人亚洲视频 | 亚洲国产一区二区在线 | www.五月婷婷.com | 97国产在线视频 | 九九热在线免费观看 | 国产精品国产自产拍高清 | 国产视频中文字幕 | 亚洲综合成人网 | 成年人视频在线免费观看 | 欧美一区二区黄 | 中文字幕亚洲欧美 | 夜夜爽99久久国产综合精品女不卡 | 国产区在线观看 | 成人一区二区三区在线观看 | 日韩中文在线视频 | 91视频国产一区 | 国产精品久久久久久久久久三级 | 黑人一级黄色大片 | 看真人视频一级毛片 | 日本高清aⅴ毛片免费 | 国产精品自产拍 | 国产精品视频久久久久 | 日韩伦理一区二区三区 | 久久亚洲国产精品 | 日韩精品一区二区三区第95 | 日韩综合一区 |