本文目錄一覽:
- 1、Python對象的拷貝
- 2、python語言的內置對象類型有哪些
- 3、python類的定義與使用是什麼
- 4、python中的instance是什麼對象類型
- 5、python中類的實例對象的理解總結?
Python對象的拷貝
Python賦值操作或函數參數傳遞,傳遞的永遠是對象引用(即內存地址),而不是對象內容。在Python中一切皆對象,對象又分為可變(mutable)和不可變(immutable)兩種類型。對象拷貝是指在內存中創建新的對象,產生新的內存地址。當頂層對象和它的子元素對象全都是immutable不可變對象時,不存在被拷貝,因為沒有產生新對象。淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象。
Python中一切皆對象,對象就像一個塑料盒子, 裏面裝的是數據。對象有不同類型,例如布爾型和整型,類型決定了可以對它進行的操作。現實生活中的”陶器”會暗含一些信息(例如它可能很重且易碎,注意不要掉到地上)。
對象的類型還決定了它裝着的數據是允許被修改的變量(可變的mutable)還是不可被修改的常量(不可變的immutable)。你可以把不可變對象想像成一個透明但封閉的盒子:你可以看到裏面裝的數據,但是無法改變它。類似地,可變對象就像一個開着口的盒子,你不僅可以看到裏面的數據,還可以拿出來修改它,但你無法改變這個盒子本身,即你無法改變對象的類型。
對象拷貝是指在內存中創建新的對象,產生新的內存地址。
淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。
2.1.1. 頂層是mutable,子元素全是immutable
當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, ‘world’, 2]
① 創建列表對象並賦值給變量a
② 導入copy模塊,使用copy.copy()函數淺拷貝a,並賦值給變量b
③ 修改變量a的子元素a[0] = 3,由於整數是不可變對象,所以並不是修改1變為3,而是更改a[0]指向對象3
當頂層對象是 mutable可變對象 ,但子元素也存在 mutable可變對象 時,如 [1, 2, [‘hello’,’world’]]
① 淺拷貝 copy.copy() 只拷貝了頂層對象,沒有拷貝子元素對象[‘hello’,’world’],即a[2]和b[2]指向同一個列表對象
② 修改a[2][1] = ‘china’,則b[2][1] = ‘china’
當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)
變量a與變量b指向的是同一個元組對象,沒有拷貝
當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, [‘hello’,’world’])
變量a與變量b指向的是相同的元組對象,並且a[2]與b[2]指向同一個列表,所以修改a[2][1]會影響b[2][1]
深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象
當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, ‘world’, 2]
變量a與變量b指向不同的列表對象,修改a[0]只是將列表a的第一個元素重新指向新對象,不會影響b[0]
當頂層對象是mutable可變對象,但子元素也存在mutable可變對象時,如[1, 2, [‘hello’,’world’]]
深拷貝既拷貝了頂層對象,又遞歸拷貝了子元素對象,所以a[2]與b[2]指向了兩個不同的列表對象(但是列表對象的子元素初始指定的字符串對象一樣),修改a[2][1] = ‘china’後,它重新指向了新的字符串對象(內存地址為140531581905808),不會影響到b[2][1]
當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)
變量a與變量b指向的是同一個元組對象,不存在拷貝
當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, [‘hello’,’world’])
變量a與變量b指向的是不同的元組對象,同時a[2]與b[2]指向不同的列表對象,所以修改a[2][1]不會影響b[2][1]
使用=是賦值,即將列表對象的引用也賦值給變量b,可以將列表對象想像成一個盒子,變量a相當於這個盒子上的標籤,執行b = a後,相當於再在這個盒子上貼上b標籤,a和b實際上指向的是同一個對象。因此,無論我們是通過a還是通過b來修改列表的內容,其結果都會作用於雙方。
b/c/d都是a的複製,它們都指向了不同的列表對象,但是沒有拷貝子元素,a[2]和b[2]/c[2]/d[2]指向同一個列表, 相當於淺拷貝的效果
使用分片[:]操作,a和b其實是指向同一個元組,而且沒有拷貝子元素,a[2]和b[2]也指向同一個列表,相當於淺拷貝的效果
同列表類似,可以使用字典的copy()函數或者轉換函數dict()
變量a與變量b/c指向不同的字典,但是沒有拷貝子元素,a[‘jobs’]和b[‘jobs’]/c[‘jobs’]指定同一個列表, 相當於淺拷貝的效果
同列表類似,可以使用集合的copy()函數或者轉換函數set()
變量a與變量b/c指向不同的集合,而集合的元素必須是hashable,所以修改集合a不會影響到b/c
python語言的內置對象類型有哪些
python的內置對象
對象類型 常量示例/用法
Number(數字) 3.14159, 1234, 999L 3+4j
String(字符串) ‘spam’, “guido’s”
List(列表) [1,[2, ‘Three’],4]
Dictionary(字典) {‘food’:’spam’, ‘taste’:’yum’}
Tuple(元組) (1,’spam’,4,’U’)
File(文件) text=open(‘egges’,’r’).read()
python類的定義與使用是什麼
1、類概念的引入
如果了解了面向對象之後,接下來由客觀世界中的對象拓展到計算機中的對象,再對客觀世界中的對象進行特徵和行為的提取,從而拓展到計算機中對象的屬性和方法的提取,最終採用抽象提取計算機中對象的共同屬性和方法,形成類。
在客觀世界中,對象是指人們在行動或思考時作為目標的事物。例如,買車、買房、買包,這些都具有購買的目標,這些目標就是購買對象。萬事萬物皆是對象,對象分為有形對象和無形對象。有形對象是人們看得見、摸得着的對象。無形對象是人們看不見、摸不着的對象,但它也是人們行動或思考的目標,也屬於對象,如記憶、計劃等。
在計算機中,對象是客觀世界中的對象在計算機中的映射。例如,一條狗是客觀世界中的對象,它有品種、名字和年齡等數據信息。但是在計算機軟件開發研究的過程中,注重的是它的品種、年齡等信息。由此可見,客觀世界中的對象要映射到計算機中需要進行篩選。
計算機中對象的內涵包括以下三個方面:
①對象具有唯一性。每個對象都有自身唯一的標識,並且它的標識在其整個生命周期中都不會改變。不同的對象有不同的標識。
②對象是構成軟件系統的一個基本單位。面向對象編程是以對象為導向,以對象為目標的,也就是說,軟件系統是基於對象的。
③對象是屬性和方法的統一體。描述一個人,姓名、年齡是描述他的屬性數據,跳舞、唱歌是他的操作方法,屬性和方法構成了計算機中的對象。
由上文可知,客觀世界中的對象的特徵映射為計算機中的對象的屬性,行為映射為方法。
2、由抽象獲得類
抽象是一個提取各種對象共同特徵和行為的一個過程。例如,兩支筆,它們有共同的顏色、材質,它們都能寫字、畫畫,即有共同的特徵和行為。提取共同特徵和行為之後,就可以總結出筆的概念。拓展到計算機中的對象,就是用抽象提取對象的共同屬性和方法,從而形成類。
類是具有相同屬性和方法的一組對象的集合。在Python中,對象是類的實例,類是對象的抽象。
3、定義類
定義類的語法和定義函數的語法類似,定義函數使用的關鍵字是def,而定義類使用的關鍵字是class。定義類的基本語法格式如下:
class 類名:
pass
以定義一個最簡單的類為例,這裡定義了一個類名為Cat的類,它是「空」的,僅僅展示了定義類的基本語法:
class Cat:
… pass
…
以上就是Python中類的概念,更多關於Python的基礎性知識點可以看下這個更加直觀視頻教程:網頁鏈接,希望我的回答能幫到你。
python中的instance是什麼對象類型
面向對象最重要的概念就是類(Class)和實例(Instance),必須牢記類是抽象的模板,比如Student類,而實例是根據類創建出來的一個個具體的「對象」,每個對象都擁有相同的方法,但各自的數據可能不同。
仍以Student類為例,在Python中,定義類是通過class關鍵字:
class Student(object):
pass
class後面緊接着是類名,即Student,類名通常是大寫開頭的單詞,緊接着是(object),表示該類是從哪個類繼承下來的,繼承的概念我們後面再講,通常,如果沒有合適的繼承類,就使用object類,這是所有類最終都會繼承的類。
定義好了Student類,就可以根據Student類創建出Student的實例,創建實例是通過類名+()實現的:
bart = Student()
bart
__main__.Student object at 0x10a67a590
Student
class ‘__main__.Student’
可以看到,變量bart指向的就是一個Student的實例,後面的0x10a67a590是內存地址,每個object的地址都不一樣,而Student本身則是一個類。
可以自由地給一個實例變量綁定屬性,比如,給實例bart綁定一個name屬性:
bart.name = ‘Bart Simpson’
bart.name
‘Bart Simpson’
由於類可以起到模板的作用,因此,可以在創建實例的時候,把一些我們認為必須綁定的屬性強制填寫進去。通過定義一個特殊的__init__方法,在創建實例的時候,就把name,score等屬性綁上去:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
注意到__init__方法的第一個參數永遠是self,表示創建的實例本身,因此,在__init__方法內部,就可以把各種屬性綁定到self,因為self就指向創建的實例本身。
有了__init__方法,在創建實例的時候,就不能傳入空的參數了,必須傳入與__init__方法匹配的參數,但self不需要傳,Python解釋器自己會把實例變量傳進去:
bart = Student(‘Bart Simpson’, 59)
bart.name
‘Bart Simpson’
bart.score
59
和普通的函數相比,在類中定義的函數只有一點不同,就是第一個參數永遠是實例變量self,並且,調用時,不用傳遞該參數。除此之外,類的方法和普通函數沒有什麼區別,所以,你仍然可以用默認參數、可變參數、關鍵字參數和命名關鍵字參數。
python中類的實例對象的理解總結?
9.3.3. 實例對象
現在我們可以用實例對象作什麼?實例對象唯一可用的操作就是屬性引用。有兩種有效的屬性名。
數據屬性 相當於 Smalltalk 中的「實例變量」或 C++ 中的「數據成員」。和局部變量一樣,數據屬性不需要聲明,第一次使用時它們就會生成。例如,如果 x 是前面創建的 MyClass 實例,下面這段代碼會打印出 16 而在堆棧中留下多餘的東西:
x.counter = 1
while x.counter 10:
x.counter = x.counter * 2
print(x.counter)
del x.counter
另一種為實例對象所接受的引用屬性是 方法。方法是「屬於」一個對象的函數。(在 Python 中,方法不止是類實例所獨有:其它類型的對象也可有方法。例如,鏈表對象有 append,insert,remove,sort 等等方法。然而,在後面的介紹中,除非特別說明,我們提到的方法特指類方法)
實例對象的有效名稱依賴於它的類。按照定義,類中所有(用戶定義)的函數對象對應它的實例中的方法。所以在我們的例子中,x.f 是一個有效的方法引用,因為 MyClass.f 是一個函數。但 x.i 不是,因為 MyClass.i 不是函數。不過 x.f 和 MyClass.f 不同,它是一個 方法對象 ,不是一個函數對象。
原創文章,作者:BPA0U,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/128626.html