Python面向?qū)ο缶幊膛c對(duì)象拷貝機(jī)制詳解
1. 面向?qū)ο缶幊痰暮诵母拍蠲嫦驅(qū)ο缶幊蘋(píng)OP是Python中最重要的編程范式之一。與過(guò)程式編程不同OOP將數(shù)據(jù)和操作數(shù)據(jù)的方法綁定在一起形成對(duì)象的概念。這種編程方式更接近人類對(duì)現(xiàn)實(shí)世界的認(rèn)知方式。在Python中一切皆對(duì)象。即使是簡(jiǎn)單的數(shù)字、字符串也都是對(duì)象。理解這一點(diǎn)對(duì)掌握Python至關(guān)重要。每個(gè)對(duì)象都有三個(gè)基本特征身份id、類型type和值value。身份是對(duì)象在內(nèi)存中的唯一標(biāo)識(shí)可以通過(guò)id()函數(shù)獲取類型決定了對(duì)象支持的操作可以通過(guò)type()函數(shù)獲取值則是對(duì)象存儲(chǔ)的具體數(shù)據(jù)。注意Python中的對(duì)象身份id實(shí)際上是對(duì)象在內(nèi)存中的地址但在不同Python實(shí)現(xiàn)中可能有不同的表現(xiàn)方式。CPython中使用內(nèi)存地址作為id但這不是語(yǔ)言規(guī)范要求的。1.1 類與實(shí)例的關(guān)系類是創(chuàng)建對(duì)象的藍(lán)圖或模板。定義類使用class關(guān)鍵字后面跟著類名通常采用駝峰命名法。類中可以定義屬性和方法它們分別代表對(duì)象的數(shù)據(jù)和行為。class Person: def __init__(self, name, age): self.name name # 實(shí)例屬性 self.age age # 實(shí)例屬性 def greet(self): # 實(shí)例方法 return fHello, Im {self.name}, {self.age} years old.實(shí)例是根據(jù)類創(chuàng)建的具體對(duì)象。創(chuàng)建實(shí)例的過(guò)程稱為實(shí)例化通過(guò)調(diào)用類名像函數(shù)一樣來(lái)完成。Python會(huì)自動(dòng)調(diào)用__init__方法如果定義了來(lái)初始化新創(chuàng)建的對(duì)象。person1 Person(Alice, 30) person2 Person(Bob, 25)1.2 三大特性封裝、繼承和多態(tài)封裝是OOP的基礎(chǔ)特性它將數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝在一個(gè)單元類中。在Python中通過(guò)屬性和方法實(shí)現(xiàn)封裝。雖然Python沒(méi)有嚴(yán)格的訪問(wèn)控制如Java的private、protected但可以通過(guò)命名約定來(lái)表示屬性的訪問(wèn)級(jí)別單下劃線開(kāi)頭表示保護(hù)成員雙下劃線開(kāi)頭表示私有成員。class BankAccount: def __init__(self, balance): self.__balance balance # 私有屬性 def deposit(self, amount): if amount 0: self.__balance amount def get_balance(self): return self.__balance繼承允許我們定義一個(gè)類繼承另一個(gè)類的特性。被繼承的類稱為父類或基類繼承的類稱為子類或派生類。Python支持多重繼承即一個(gè)類可以繼承多個(gè)父類。class Animal: def __init__(self, name): self.name name def speak(self): raise NotImplementedError(Subclass must implement this method) class Dog(Animal): def speak(self): return f{self.name} says Woof! class Cat(Animal): def speak(self): return f{self.name} says Meow!多態(tài)是指不同類的對(duì)象對(duì)同一消息方法調(diào)用做出不同響應(yīng)的能力。Python中的多態(tài)是鴨子類型的體現(xiàn)——如果一個(gè)對(duì)象像鴨子一樣走路、像鴨子一樣叫那它就是鴨子。def animal_sound(animal): print(animal.speak()) dog Dog(Buddy) cat Cat(Whiskers) animal_sound(dog) # 輸出: Buddy says Woof! animal_sound(cat) # 輸出: Whiskers says Meow!1.3 特殊方法與運(yùn)算符重載Python通過(guò)特殊方法也稱為魔術(shù)方法實(shí)現(xiàn)了許多語(yǔ)言特性。這些方法以雙下劃線開(kāi)頭和結(jié)尾如__init__、__str__等。通過(guò)實(shí)現(xiàn)這些方法我們可以自定義類的行為。class Vector: def __init__(self, x, y): self.x x self.y y def __add__(self, other): return Vector(self.x other.x, self.y other.y) def __str__(self): return fVector({self.x}, {self.y}) v1 Vector(2, 3) v2 Vector(4, 5) print(v1 v2) # 輸出: Vector(6, 8)常用的特殊方法包括__init__: 對(duì)象初始化__str__: 對(duì)象的字符串表示print時(shí)調(diào)用__repr__: 對(duì)象的官方字符串表示交互式環(huán)境顯示__len__: 返回長(zhǎng)度len()函數(shù)調(diào)用__getitem__/__setitem__: 索引操作__iter__/__next__: 迭代協(xié)議__call__: 使實(shí)例可調(diào)用2. Python中的對(duì)象引用機(jī)制理解Python的對(duì)象引用機(jī)制是掌握深拷貝和淺拷貝的基礎(chǔ)。Python中的變量實(shí)際上是對(duì)對(duì)象的引用而不是對(duì)象本身。這與C/C等語(yǔ)言中的變量概念有本質(zhì)區(qū)別。2.1 可變對(duì)象與不可變對(duì)象Python中的對(duì)象分為可變和不可變兩種類型。不可變對(duì)象一旦創(chuàng)建就不能修改其值包括數(shù)字int、float、字符串、元組等??勺儗?duì)象可以在不改變其身份id的情況下修改其值包括列表、字典、集合等。# 不可變對(duì)象示例 a 10 print(id(a)) # 輸出a的id a 1 print(id(a)) # id改變實(shí)際上是創(chuàng)建了新對(duì)象 # 可變對(duì)象示例 lst [1, 2, 3] print(id(lst)) # 輸出lst的id lst.append(4) print(id(lst)) # id不變修改了原對(duì)象2.2 賦值操作的實(shí)質(zhì)Python中的賦值操作實(shí)際上是創(chuàng)建了一個(gè)對(duì)對(duì)象的引用而不是復(fù)制對(duì)象本身。這意味著多個(gè)變量可以引用同一個(gè)對(duì)象。a [1, 2, 3] b a # b和a引用同一個(gè)列表對(duì)象 b.append(4) print(a) # 輸出: [1, 2, 3, 4]這種行為對(duì)于不可變對(duì)象通常不會(huì)引起問(wèn)題但對(duì)于可變對(duì)象可能導(dǎo)致意外的修改。理解這一點(diǎn)對(duì)于避免程序中的bug非常重要。2.3 函數(shù)參數(shù)傳遞機(jī)制Python的函數(shù)參數(shù)傳遞采用的是傳對(duì)象引用的方式。對(duì)于不可變對(duì)象函數(shù)內(nèi)部對(duì)參數(shù)的修改不會(huì)影響外部變量對(duì)于可變對(duì)象函數(shù)內(nèi)部的修改會(huì)影響外部變量。def modify_list(lst): lst.append(4) # 修改會(huì)影響外部變量 def modify_number(num): num 1 # 不會(huì)影響外部變量 my_list [1, 2, 3] my_num 10 modify_list(my_list) modify_number(my_num) print(my_list) # 輸出: [1, 2, 3, 4] print(my_num) # 輸出: 103. 淺拷貝與深拷貝的區(qū)別與應(yīng)用在實(shí)際編程中我們經(jīng)常需要復(fù)制對(duì)象。Python提供了多種復(fù)制對(duì)象的方式理解它們的區(qū)別對(duì)于編寫(xiě)正確的程序至關(guān)重要。3.1 淺拷貝的實(shí)現(xiàn)方式淺拷貝創(chuàng)建一個(gè)新對(duì)象但它只復(fù)制對(duì)象的頂層結(jié)構(gòu)而不復(fù)制嵌套的對(duì)象。淺拷貝可以通過(guò)以下幾種方式實(shí)現(xiàn)切片操作適用于序列類型original [1, 2, [3, 4]] shallow_copy original[:]使用copy模塊的copy函數(shù)import copy original [1, 2, [3, 4]] shallow_copy copy.copy(original)某些類型的構(gòu)造函數(shù)original [1, 2, [3, 4]] shallow_copy list(original)淺拷貝的特點(diǎn)是新對(duì)象和原對(duì)象是獨(dú)立的對(duì)象但它們包含的子對(duì)象是共享的。original [1, 2, [3, 4]] shallow_copy original[:] # 修改頂層元素 shallow_copy[0] 100 print(original) # 輸出: [1, 2, [3, 4]] print(shallow_copy) # 輸出: [100, 2, [3, 4]] # 修改嵌套元素 shallow_copy[2][0] 300 print(original) # 輸出: [1, 2, [300, 4]] print(shallow_copy) # 輸出: [100, 2, [300, 4]]3.2 深拷貝的實(shí)現(xiàn)方式深拷貝創(chuàng)建一個(gè)新對(duì)象并遞歸地復(fù)制所有嵌套的對(duì)象。深拷貝通過(guò)copy模塊的deepcopy函數(shù)實(shí)現(xiàn)import copy original [1, 2, [3, 4]] deep_copy copy.deepcopy(original)深拷貝的特點(diǎn)是新對(duì)象和原對(duì)象是完全獨(dú)立的包括所有嵌套的對(duì)象。original [1, 2, [3, 4]] deep_copy copy.deepcopy(original) # 修改頂層元素 deep_copy[0] 100 print(original) # 輸出: [1, 2, [3, 4]] print(deep_copy) # 輸出: [100, 2, [3, 4]] # 修改嵌套元素 deep_copy[2][0] 300 print(original) # 輸出: [1, 2, [3, 4]] print(deep_copy) # 輸出: [100, 2, [300, 4]]3.3 何時(shí)使用淺拷貝與深拷貝選擇使用淺拷貝還是深拷貝取決于具體的應(yīng)用場(chǎng)景使用淺拷貝的情況對(duì)象只包含原始類型或其他不可變對(duì)象需要共享子對(duì)象以節(jié)省內(nèi)存明確知道子對(duì)象不會(huì)被修改使用深拷貝的情況對(duì)象包含嵌套的可變對(duì)象需要完全獨(dú)立的副本不確定子對(duì)象是否會(huì)被修改提示深拷貝比淺拷貝消耗更多的資源和時(shí)間特別是對(duì)于包含大量嵌套對(duì)象的復(fù)雜結(jié)構(gòu)。在實(shí)際應(yīng)用中應(yīng)根據(jù)需要選擇最合適的拷貝方式。4. 實(shí)際應(yīng)用中的常見(jiàn)問(wèn)題與解決方案在實(shí)際編程中對(duì)象拷貝相關(guān)的錯(cuò)誤很常見(jiàn)。下面介紹一些典型問(wèn)題及其解決方案。4.1 默認(rèn)參數(shù)的可變陷阱函數(shù)默認(rèn)參數(shù)在函數(shù)定義時(shí)求值一次而不是每次調(diào)用時(shí)求值。如果默認(rèn)參數(shù)是可變對(duì)象可能會(huì)導(dǎo)致意外的行為。def append_to(element, lst[]): lst.append(element) return lst print(append_to(1)) # 輸出: [1] print(append_to(2)) # 輸出: [1, 2]解決方案是使用不可變對(duì)象如None作為默認(rèn)值然后在函數(shù)內(nèi)部創(chuàng)建可變對(duì)象def append_to(element, lstNone): if lst is None: lst [] lst.append(element) return lst4.2 循環(huán)引用與深拷貝當(dāng)對(duì)象之間存在循環(huán)引用時(shí)深拷貝可能會(huì)導(dǎo)致無(wú)限遞歸或棧溢出。copy模塊的deepcopy函數(shù)已經(jīng)處理了這種情況但需要注意性能影響。a [] b [a] a.append(b) import copy c copy.deepcopy(a) # 可以正確處理循環(huán)引用4.3 自定義拷貝行為可以通過(guò)實(shí)現(xiàn)__copy__和__deepcopy__方法來(lái)自定義類的拷貝行為。class MyClass: def __init__(self, value): self.value value self.ref None def __copy__(self): new_obj MyClass(self.value) new_obj.ref self.ref # 淺拷貝ref return new_obj def __deepcopy__(self, memo): new_obj MyClass(copy.deepcopy(self.value, memo)) new_obj.ref copy.deepcopy(self.ref, memo) return new_obj4.4 性能優(yōu)化建議對(duì)于大型數(shù)據(jù)結(jié)構(gòu)深拷貝可能非常耗時(shí)??梢钥紤]以下優(yōu)化策略僅在必要時(shí)使用深拷貝對(duì)于不可變部分使用淺拷貝實(shí)現(xiàn)自定義的__deepcopy__方法優(yōu)化特定場(chǎng)景考慮使用不可變數(shù)據(jù)結(jié)構(gòu)如namedtuple替代可變結(jié)構(gòu)from collections import namedtuple Point namedtuple(Point, [x, y]) p1 Point(1, 2) p2 p1 # 不需要拷貝因?yàn)閚amedtuple是不可變的

相關(guān)新聞

HTTP 500錯(cuò)誤排查實(shí)戰(zhàn):從日志分析到代碼防御的完整指南

HTTP 500錯(cuò)誤排查實(shí)戰(zhàn):從日志分析到代碼防御的完整指南

1. 從一次深夜告警說(shuō)起:當(dāng)API突然“罷工” 凌晨?jī)牲c(diǎn),手機(jī)屏幕突然亮起,刺眼的告警通知彈了出來(lái):“生產(chǎn)環(huán)境核心下單接口請(qǐng)求失敗率飆升,大量HTTP 500錯(cuò)誤”。相信對(duì)于任何一個(gè)后端開(kāi)發(fā)者或運(yùn)維工程師來(lái)說(shuō),這…

2026/7/31 7:55:06 閱讀更多
物聯(lián)網(wǎng)安全期末復(fù)習(xí):9大必考簡(jiǎn)答題解析與知識(shí)體系構(gòu)建

物聯(lián)網(wǎng)安全期末復(fù)習(xí):9大必考簡(jiǎn)答題解析與知識(shí)體系構(gòu)建

1. 物聯(lián)網(wǎng)安全期末復(fù)習(xí)的核心定位與價(jià)值又到了期末季,對(duì)于ZZU物聯(lián)網(wǎng)工程、網(wǎng)絡(luò)安全等相關(guān)專業(yè)的同學(xué)來(lái)說(shuō),物聯(lián)網(wǎng)安全這門(mén)課,知識(shí)點(diǎn)多且雜,概念抽象,協(xié)議繁雜,考試時(shí)簡(jiǎn)答題往往是拉開(kāi)分?jǐn)?shù)差距的關(guān)鍵。很多同…

2026/7/31 7:45:06 閱讀更多
C++項(xiàng)目集成CUDA實(shí)戰(zhàn):從環(huán)境配置到性能優(yōu)化的完整指南

C++項(xiàng)目集成CUDA實(shí)戰(zhàn):從環(huán)境配置到性能優(yōu)化的完整指南

1. 項(xiàng)目概述:為什么要在C里集成CUDA? 如果你手頭有個(gè)C項(xiàng)目,計(jì)算量越來(lái)越大,CPU核心跑滿了還是覺(jué)得慢,那大概率是時(shí)候考慮GPU了。CUDA,作為NVIDIA GPU的通用計(jì)算平臺(tái),就是干這個(gè)的。它能讓你的程…

2026/7/31 7:45:06 閱讀更多
優(yōu)質(zhì)睡眠的科學(xué)機(jī)制與實(shí)用提升策略

優(yōu)質(zhì)睡眠的科學(xué)機(jī)制與實(shí)用提升策略

1. 睡眠質(zhì)量與生活狀態(tài)的深度關(guān)聯(lián) 那天早上醒來(lái)時(shí),陽(yáng)光透過(guò)窗簾的縫隙灑在床上,我清晰地記得自己是如何自然地睜開(kāi)眼睛的——沒(méi)有鬧鐘的刺耳聲響,沒(méi)有反復(fù)掙扎的困倦感,更沒(méi)有那種"再睡五分鐘"的拖延沖動(dòng)。這種高質(zhì)量的…

2026/7/31 8:55:08 閱讀更多
抖音收緊四類AI仿真人劇準(zhǔn)入門(mén)檻,最受傷的是“量產(chǎn)型“團(tuán)隊(duì)

抖音收緊四類AI仿真人劇準(zhǔn)入門(mén)檻,最受傷的是“量產(chǎn)型“團(tuán)隊(duì)

都市情感、破局成長(zhǎng)、家庭溫情、都市逆襲——這四個(gè)聽(tīng)起來(lái)耳熟的品類名稱,恰好是過(guò)去一年AI仿真人劇最集中的四條賽道。7月23日,抖音集團(tuán)短劇版權(quán)中心發(fā)布公告:自8月3日起,這四類AI仿真人劇將正式實(shí)施新的內(nèi)容制作規(guī)范。平臺(tái)從畫(huà)面…

2026/7/31 8:55:08 閱讀更多
雨云安興免費(fèi) SSL證書(shū) 使用體驗(yàn)

雨云安興免費(fèi) SSL證書(shū) 使用體驗(yàn)

搭建個(gè)人博客、小程序站點(diǎn),HTTPS 已是必備配置。雨云 SSL 板塊包含多款證書(shū)產(chǎn)品,其中免費(fèi)證書(shū)僅有 TrustAsia 亞洲誠(chéng)信(安興)DV 證書(shū),分為單域名、多域名兩種,證書(shū)有效期統(tǒng)一 3 個(gè)月,整套申請(qǐng)、…

2026/7/31 8:55:08 閱讀更多
C++調(diào)用PyTorch模型實(shí)戰(zhàn):ONNX Runtime部署與性能優(yōu)化指南

C++調(diào)用PyTorch模型實(shí)戰(zhàn):ONNX Runtime部署與性能優(yōu)化指南

1. 項(xiàng)目概述:為什么要在C中調(diào)用PyTorch模型?如果你是一名C后端工程師,或者正在開(kāi)發(fā)一個(gè)對(duì)性能、部署環(huán)境有嚴(yán)格要求的應(yīng)用(比如嵌入式設(shè)備、高性能服務(wù)器、游戲引擎),那么你很可能遇到過(guò)這個(gè)需求&#xff1…

2026/7/31 8:55:08 閱讀更多
智能車(chē)競(jìng)賽開(kāi)源項(xiàng)目:從PID控制到圖像處理的嵌入式系統(tǒng)設(shè)計(jì)實(shí)踐

智能車(chē)競(jìng)賽開(kāi)源項(xiàng)目:從PID控制到圖像處理的嵌入式系統(tǒng)設(shè)計(jì)實(shí)踐

1. 項(xiàng)目回顧與核心價(jià)值提煉全國(guó)大學(xué)生智能汽車(chē)競(jìng)賽,這個(gè)被我們簡(jiǎn)稱為“智能車(chē)”的比賽,對(duì)于每一位參與其中的同學(xué)來(lái)說(shuō),都不僅僅是一次技術(shù)比拼,更是一場(chǎng)關(guān)于工程實(shí)踐、團(tuán)隊(duì)協(xié)作與心理素質(zhì)的全面淬煉。當(dāng)四輪車(chē)組的代碼倉(cāng)庫(kù)最終開(kāi)源…

2026/7/31 8:55:08 閱讀更多
Matlab子圖布局進(jìn)階:從subplot到Position屬性與tiledlayout的精確控制

Matlab子圖布局進(jìn)階:從subplot到Position屬性與tiledlayout的精確控制

1. 項(xiàng)目概述:為什么需要精細(xì)控制子圖?在Matlab里畫(huà)圖,subplot幾乎是每個(gè)使用者最早接觸的命令之一。一句subplot(2,2,1)就能輕松把畫(huà)布分成四宮格,然后在第一個(gè)格子里畫(huà)圖,這確實(shí)方便。但用久了你會(huì)發(fā)現(xiàn),它…

2026/7/31 8:45:08 閱讀更多
HART協(xié)議詳解:05 HART現(xiàn)場(chǎng)通信實(shí)戰(zhàn)

HART協(xié)議詳解:05 HART現(xiàn)場(chǎng)通信實(shí)戰(zhàn)

第五季 HART現(xiàn)場(chǎng)通信實(shí)戰(zhàn) ——從USB-HART Modem抓包到工程診斷:讓協(xié)議知識(shí)變成維修能力 各位工業(yè)現(xiàn)場(chǎng)的工程師朋友們,大家好! 經(jīng)過(guò)前四季的系統(tǒng)學(xué)習(xí),我們已經(jīng)構(gòu)建了HART協(xié)議的完整理論框架: 第一季:六層生命模型與本質(zhì)認(rèn)知 第二季:物理層4–20mA與FSK魔法 第三季:數(shù)…

2026/7/31 0:14:40 閱讀更多
維修工程師的示波器實(shí)戰(zhàn):02 探頭地線——示波器最大的“坑”

維修工程師的示波器實(shí)戰(zhàn):02 探頭地線——示波器最大的“坑”

第二篇:探頭地線——示波器最大的“坑” ——那根不起眼的小地線,可能比你測(cè)的信號(hào)還重要 很多工程師第一次用示波器時(shí),都會(huì)經(jīng)歷這樣一個(gè)“驚魂”時(shí)刻。 某食品廠包裝線,伺服偶發(fā)報(bào)警。年輕工程師判斷是編碼器信號(hào)受干擾,便拿出示波器認(rèn)真測(cè)量。波形一出來(lái),所有人都倒…

2026/7/31 0:14:40 閱讀更多
SAP財(cái)務(wù)核心技能:FAGLB03科目余額查詢深度解析與實(shí)戰(zhàn)指南

SAP財(cái)務(wù)核心技能:FAGLB03科目余額查詢深度解析與實(shí)戰(zhàn)指南

1. 項(xiàng)目概述:為什么科目余額查詢是SAP財(cái)務(wù)的“定盤(pán)星”?干了十幾年SAP財(cái)務(wù)顧問(wèn),我見(jiàn)過(guò)太多剛?cè)胄械呐笥?amp;#xff0c;一上來(lái)就急著學(xué)復(fù)雜的憑證過(guò)賬、月結(jié)流程,結(jié)果在第一個(gè)月結(jié)日就卡殼了。老板問(wèn)“這個(gè)月利潤(rùn)多少?”&…

2026/7/31 0:14:40 閱讀更多