Python變量賦值與引用之對象是否可變詳解
概述
在Python中,變量賦值的機制涉及到對象的引用和對象的可變性。變量名只是對象的引用,而不是直接存儲數(shù)據(jù)。因此,變量a和b賦值后的行為差異,取決于兩個因素:
- 對象是否可變(Mutable/Immutable)。
- 修改操作的類型(直接修改對象內(nèi)容,還是重新賦值變量)。
1. 不可變對象(Immutable Objects)
不可變對象的值一旦創(chuàng)建,就不能修改其內(nèi)容,例如:
- 整數(shù)(
int) - 字符串(
str) - 元組(
tuple) - 布爾值(
bool)等。
場景:修改變量的新賦值
a = 5 # a指向整數(shù)對象5 b = a # b也指向同一個整數(shù)對象5 a = 6 # 此時a指向新的整數(shù)對象6,但b仍指向5 print(b) # 輸出5
原因:
- 賦值操作
b = a時,僅復(fù)制引用,使得a和b都指向同一個對象(初始是5)。 - 當(dāng)
a = 6時,a的引用被更新為指向新對象6,而b仍然指向原對象5。 - 不可變對象無法被修改內(nèi)容,只能重新創(chuàng)建新對象,因此
b不會變化。
場景:嘗試直接修改對象內(nèi)容(無效)
a = "hello" # a指向字符串"hello" b = a # b也指向相同的字符串對象 # 嘗試修改字符串內(nèi)容(但不可變對象不允許此操作) a[0] = "H" # 報錯:'str' object does not support item assignment
結(jié)果:此操作根本無法執(zhí)行,因為字符串是不可變的。
2. 可變對象(Mutable Objects)
可變對象的值可以在創(chuàng)建后被修改,例如:
- 列表(
list) - 字典(
dict) - 集合(
set) - 自定義類實例等。
場景:直接修改對象內(nèi)容
a = [1, 2] # a指向列表[1, 2] b = a # b指向同一個列表對象 a.append(3) # 修改列表內(nèi)容,原列表變?yōu)閇1, 2, 3] print(b) # 輸出[1, 2, 3]
原因:
a和b指向同一個列表對象。append()方法直接修改了該對象的內(nèi)部內(nèi)容,因此兩個變量看到的都是同一個被修改后的對象。
場景:修改變量的引用(不影響對方)
a = [1, 2] b = a a = [3, 4] # a的引用被更新為新列表[3,4],但b仍指向原列表[1,2] print(b) # 輸出[1, 2]
原因:
a = [3,4]是一個新的賦值操作,直接改變了a的引用,使其指向新對象,而b未被修改,依然指向原列表。
3. 核心總結(jié)
| 情況 | 行為差異原因 |
|---|---|
| 修改對象內(nèi)容(可變對象) | a 和 b 指向同一個對象,修改內(nèi)容會影響雙方。 |
| 直接重新賦值變量(任何對象) | a 的引用指向新對象,而 b 的引用未變,因此 b 的值不受影響。 |
| 嘗試修改不可變對象的內(nèi)容 | 不可變對象無法被修改,只能生成新對象,原對象的引用不會改變。因此 b 不變。 |
4. 如何避免混淆
- 不可變對象:賦值后的變量如果像“修改了
a,b不變”,這是因為實際是生成了新對象。 - 可變對象:賦值后的變量如果像“修改了
a,b也變”,是因為兩變量指向同一個對象,修改內(nèi)容會影響雙方。
若希望二者獨立:
- 對可變對象使用深拷貝或淺拷貝:
import copy b = copy.deepcopy(a) # 完全獨立的副本
示例表格
| 示例代碼 | 是否修改對象內(nèi)容 | a 的值 | b 的值 |
|---|---|---|---|
a = 5; b = a; a = 6 | 否 | 6 | 5 |
a = [1]; b = a; a[0] = 2 | 是(修改可變對象) | [2] | [2] |
a = [1]; b = a; a = [2] | 否 | [2] | [1] |
| `a = “str”; b = a; a += “1” | 否(生成新對象) | "str1" | "str" |
關(guān)鍵點:
- 賦值是引用的復(fù)制,
b = a僅讓兩個變量指向同一個對象。 - 修改內(nèi)容 vs 重新賦值:
- 修改內(nèi)容:影響所有指向該對象的變量。
- 重新賦值:僅修改當(dāng)前變量的引用,不影響其他變量。
總結(jié)
到此這篇關(guān)于Python變量賦值與引用之對象是否可變的文章就介紹到這了,更多相關(guān)Python對象是否可變內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python的OpenCV模塊識別滑動驗證碼的缺口(推薦)
這篇文章主要介紹了使用Python的OpenCV模塊識別滑動驗證碼的缺口,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05
Python操作MongoDB的教程詳解(插,查,改,排,刪)
MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫。是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。本文將詳細和大家聊聊Python操作MongoDB的方法,需要的可以參考一下2022-09-09

