Python中可變對(duì)象和不可變對(duì)象的使用詳解
最近面試被問(wèn)到了這個(gè)問(wèn)題,寫(xiě)個(gè)帖子解釋一下可變對(duì)象和不可變對(duì)象
1. 對(duì)象可變性簡(jiǎn)介
在Python中,每個(gè)變量都是一個(gè)對(duì)象,每個(gè)對(duì)象都具有其創(chuàng)建后是否允許修改的屬性,這種特性稱(chēng)為對(duì)象的可變性。它影響對(duì)象在傳遞給函數(shù)、用于表達(dá)式或存儲(chǔ)在數(shù)據(jù)結(jié)構(gòu)中時(shí)的行為。
定義
- 可變對(duì)象:創(chuàng)建后可以改變的對(duì)象。例子包括列表、字典、集合和用戶(hù)定義的對(duì)象。
- 不可變對(duì)象:一旦創(chuàng)建后不允許被修改的對(duì)象。例子包括整數(shù)、浮點(diǎn)數(shù)、字符串、元組和凍結(jié)集合。
2. 不可變對(duì)象的特性
不可變對(duì)象包括數(shù)字(整數(shù)和浮點(diǎn)數(shù))、字符串、元組等。這些對(duì)象的共同特點(diǎn)是一旦創(chuàng)建,它們的內(nèi)存中的數(shù)據(jù)不可改變。
2.1 字符串
字符串是不可變對(duì)象的典型例子。當(dāng)嘗試修改字符串的內(nèi)容時(shí),Python并不是修改原有的字符串,而是創(chuàng)建一個(gè)新的字符串對(duì)象。
str1 = "Hello"
# 嘗試更改字符串的內(nèi)容
str2 = str1.replace('H', 'J')
print(str1) # 輸出 Hello,原字符串未改變
print(str2) # 輸出 Jello,創(chuàng)建了一個(gè)新字符串
2.2 整數(shù)和浮點(diǎn)數(shù)
整數(shù)和浮點(diǎn)數(shù)也是不可變對(duì)象。每次對(duì)數(shù)字進(jìn)行修改,實(shí)際上是生成了一個(gè)新的數(shù)字對(duì)象。
x = 10 y = x x = x + 1 print(y) # 輸出 10,y 仍然指向原來(lái)的整數(shù)對(duì)象 print(x) # 輸出 11,x 現(xiàn)在指向一個(gè)新的整數(shù)對(duì)象
2.3 元組
元組的不可變性示例
不能直接更改元組中的元素。如果嘗試修改元組中的某個(gè)元素,Python 將拋出一個(gè)錯(cuò)誤。
tup = (1, 2, 3)
try:
tup[0] = 100 # 嘗試修改元組的第一個(gè)元素
except TypeError as e:
print(e) # 輸出錯(cuò)誤信息(TypeError)
元組內(nèi)含可變對(duì)象
盡管元組本身是不可變的,但如果元組中包含可變對(duì)象,如列表,這些可變對(duì)象內(nèi)部的內(nèi)容是可以被修改的。這種情況下,元組的不可變性只適用于頂層結(jié)構(gòu),不影響內(nèi)部元素的可變性。
tup_with_list = (1, [2, 3], 4) tup_with_list[1].append(5) print(tup_with_list) # 輸出 (1, [2, 3, 5], 4)
3. 可變對(duì)象的特性
可變對(duì)象如列表、字典和集合允許在對(duì)象創(chuàng)建后修改其內(nèi)容。
3.1 列表
列表是最常見(jiàn)的可變對(duì)象之一??梢栽诹斜碇刑砑?、刪除或更改元素,而無(wú)需創(chuàng)建一個(gè)新的列表對(duì)象。
lst = [1, 2, 3] lst.append(4) print(lst) # 輸出 [1, 2, 3, 4],列表內(nèi)容被修改
3.2 字典
字典也是一個(gè)可變對(duì)象??梢噪S時(shí)添加、刪除或修改字典中的鍵值對(duì)。
dic = {'a': 1, 'b': 2}
dic['c'] = 3
print(dic) # 輸出 {'a': 1, 'b': 2, 'c': 3},字典已更新
3.3 集合
集合的可變性示例
創(chuàng)建一個(gè)簡(jiǎn)單的集合,演示如何向集合中添加和刪除元素。
# 創(chuàng)建一個(gè)初始集合
my_set = {1, 2, 3}
print("初始集合:", my_set)
# 添加、移除元素
my_set.add(4)
my_set.remove(2)
print("操作后的集合:", my_set)
集合的操作限制
盡管集合是可變的,但也有一些操作上的限制。例如,集合只能包含不可變(可哈希)的對(duì)象。因此不能將列表或另一個(gè)集合作為元素添加到集合中。
nested_set = {1, 2, 3}
try:
nested_set.add([4, 5, 6]) # 嘗試添加列表到集合中
# nested_set.add({7, 8, 9}) # 嘗試添加另一個(gè)集合到集合中
except TypeError as e:
print(e) # 輸出錯(cuò)誤信息
4. 函數(shù)中的對(duì)象傳遞
理解Python中的參數(shù)傳遞方式——按引用傳遞(實(shí)際上是對(duì)象的引用地址傳遞)——是理解可變與不可變對(duì)象的關(guān)鍵。
4.1 不可變對(duì)象的傳遞
向函數(shù)傳遞不可變對(duì)象時(shí),對(duì)該對(duì)象的任何修改都不會(huì)影響原始對(duì)象,因?yàn)閷?shí)際上是創(chuàng)建了一個(gè)新的對(duì)象。
def update_number(n):
n += 10
x = 5
update_number(x)
print(x) # 輸出 5,原始值未改變
4.2 可變對(duì)象的傳遞
相反,傳遞可變對(duì)象時(shí),函數(shù)內(nèi)對(duì)對(duì)象的修改將影響原始對(duì)象。
def update_list(lst):
lst.append(4)
my_list = [1, 2, 3]
update_list(my_list)
print(my_list) # 輸出 [1, 2, 3, 4],原始列表被修改
到此這篇關(guān)于Python中可變對(duì)象和不可變對(duì)象的使用詳解的文章就介紹到這了,更多相關(guān)Python 可變對(duì)象和不可變對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中列表(list)和元組(tuple)的深入講解
這篇文章主要給大家介紹了關(guān)于python中列表(list)和元組(tuple)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
創(chuàng)建Django項(xiàng)目圖文實(shí)例詳解
這篇文章主要介紹了創(chuàng)建Django項(xiàng)目,結(jié)合圖文與實(shí)例形式詳細(xì)分析了Django項(xiàng)目創(chuàng)建的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
python實(shí)戰(zhàn)之德州撲克第二步-判斷牌型
這篇文章主要介紹了python實(shí)戰(zhàn)之德州撲克第二步-判斷牌型,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
Python實(shí)現(xiàn)簡(jiǎn)單的猜單詞小游戲
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡(jiǎn)單的猜單詞小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
python庫(kù)TextDistance量化文本之間的相似度算法探究
這篇文章主要為大家介紹了python庫(kù)TextDistance量化文本之間的相似度算法探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
python3應(yīng)用windows api對(duì)后臺(tái)程序窗口及桌面截圖并保存的方法
今天小編就為大家分享一篇python3應(yīng)用windows api對(duì)后臺(tái)程序窗口及桌面截圖并保存的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Python中的復(fù)雜數(shù)據(jù)類(lèi)型(list、tuple)
這篇文章介紹了Python中的復(fù)雜數(shù)據(jù)類(lèi)型(list、tuple),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05

