- Python程序設(shè)計(jì)與算法基礎(chǔ)教程(第2版)(微課版)
- 江紅 余青松
- 2638字
- 2019-11-15 20:18:51
2.2 Python對(duì)象和引用
2.2.1 Python對(duì)象概述
計(jì)算機(jī)程序通常用于處理各種類型的數(shù)據(jù)(即對(duì)象),不同的數(shù)據(jù)屬于不同的數(shù)據(jù)類型,支持不同的運(yùn)算操作。
在Python語(yǔ)言中,數(shù)據(jù)表示為對(duì)象。對(duì)象本質(zhì)上是一個(gè)內(nèi)存塊,擁有特定的值,支持特定類型的運(yùn)算操作。
在Python 3中,一切皆為對(duì)象。Python語(yǔ)言中的每個(gè)對(duì)象由標(biāo)識(shí)(identity)、類型(type)和值(value)標(biāo)識(shí)。
(1)標(biāo)識(shí)用于唯一地標(biāo)識(shí)一個(gè)對(duì)象,通常對(duì)應(yīng)對(duì)象在計(jì)算機(jī)內(nèi)存中的位置。使用內(nèi)置函數(shù)id(obj1)可以返回對(duì)象obj1的標(biāo)識(shí)。
(2)類型用于表示對(duì)象所屬的數(shù)據(jù)類型(類),數(shù)據(jù)類型用于限定對(duì)象的取值范圍以及允許執(zhí)行的處理操作。使用內(nèi)置函數(shù)type(obj1)可以返回對(duì)象obj1所屬的數(shù)據(jù)類型。
(3)值用于表示對(duì)象的數(shù)據(jù)類型的值。使用內(nèi)置函數(shù)print(obj1)可以返回對(duì)象obj1的值。
通過(guò)內(nèi)置的type()函數(shù)可以判斷一個(gè)對(duì)象的類型。通過(guò)內(nèi)置的id()函數(shù)可以獲取一個(gè)對(duì)象唯一的id標(biāo)識(shí)(CPython的實(shí)現(xiàn)為內(nèi)存存放位置)。
【例2.2】 使用內(nèi)置函數(shù)type()、id()和print()查看對(duì)象。

字面量123創(chuàng)建一個(gè)實(shí)例對(duì)象,其id標(biāo)識(shí)為140706558370656,類型為int類型,值為123。
在Python 3中函數(shù)和類等也是對(duì)象,也具有相應(yīng)的類型和id。
【例2.3】 查看Python的內(nèi)置函數(shù)對(duì)象。

2.2.2 使用字面量創(chuàng)建實(shí)例對(duì)象
對(duì)于內(nèi)置對(duì)象,Python通常提供使用字面量直接創(chuàng)建實(shí)例對(duì)象的語(yǔ)法。
Python的數(shù)據(jù)類型定義了一個(gè)值的集合,在Python代碼中使用字面量表示某個(gè)數(shù)據(jù)類型的值。例如,12、101等表示int數(shù)據(jù)類型的值;0.1 7、3.14等表示float數(shù)據(jù)類型的值;True和False表示bool數(shù)據(jù)類型的值;'Hello,World'、'張三'等表示str數(shù)據(jù)類型的值。
字面量在Python語(yǔ)句中解釋為表達(dá)式,Python基于字面量創(chuàng)建相應(yīng)的數(shù)據(jù)類型的對(duì)象。
【例2.4】 使用字面量創(chuàng)建實(shí)例對(duì)象。

Python使用字面量123和"abc"分別創(chuàng)建一個(gè)int型對(duì)象和一個(gè)str型對(duì)象。
2.2.3 使用類對(duì)象創(chuàng)建實(shí)例對(duì)象
通過(guò)直接調(diào)用類對(duì)象可以創(chuàng)建實(shí)例對(duì)象,其語(yǔ)法格式如下。

【例2.5】 使用類對(duì)象創(chuàng)建實(shí)例對(duì)象。

Python使用int(12)創(chuàng)建一個(gè)整數(shù)數(shù)據(jù)類型的實(shí)例對(duì)象;使用complex(1,2)創(chuàng)建一個(gè)復(fù)數(shù)類型的實(shí)例對(duì)象。
另外,表達(dá)式的運(yùn)算結(jié)果也可以創(chuàng)建新的對(duì)象;Python語(yǔ)句def會(huì)創(chuàng)建函數(shù)對(duì)象;class語(yǔ)句會(huì)創(chuàng)建類對(duì)象,詳細(xì)闡述請(qǐng)參見本書的后續(xù)章節(jié)。
2.2.4 數(shù)據(jù)類型
在Python語(yǔ)言中,所有對(duì)象都有一個(gè)數(shù)據(jù)類型。Python數(shù)據(jù)類型的定義為一個(gè)值的集合以及在這個(gè)值集上的一組運(yùn)算操作。
例如整數(shù)數(shù)據(jù)類型(int),其值的集合為所有的整數(shù),支持的運(yùn)算操作包括+(加法)、-(減法)、*(乘法)、//(整除)等,88、1024等都是整數(shù)類型數(shù)據(jù)。
每個(gè)對(duì)象存儲(chǔ)一個(gè)值,例如,int類型的對(duì)象可以存儲(chǔ)值1234、99或1333。不同的對(duì)象可以存儲(chǔ)同一個(gè)值,例如,一個(gè)str類型的對(duì)象可以存儲(chǔ)值'hello',另一個(gè)str類型的對(duì)象也可以存儲(chǔ)值'hello'。在一個(gè)對(duì)象上可執(zhí)行且只允許執(zhí)行其對(duì)應(yīng)數(shù)據(jù)類型定義的操作,例如,兩個(gè)int對(duì)象可執(zhí)行乘法運(yùn)算,但兩個(gè)str對(duì)象不允許執(zhí)行乘法運(yùn)算。
Python數(shù)據(jù)類型包括內(nèi)置數(shù)據(jù)類型和自定義數(shù)據(jù)類型。Python語(yǔ)言提供了豐富的內(nèi)置數(shù)據(jù)類型,用于有效地處理各種類型的數(shù)據(jù)。本書后續(xù)章節(jié)將展開內(nèi)置數(shù)據(jù)類型和自定義數(shù)據(jù)類型的闡述。
2.2.5 變量和對(duì)象的引用
Python對(duì)象是位于計(jì)算機(jī)內(nèi)存中的一個(gè)內(nèi)存數(shù)據(jù)塊。為了引用對(duì)象,用戶必須通過(guò)賦值語(yǔ)句把對(duì)象賦值給變量(也稱之為把對(duì)象綁定到變量)。指向?qū)ο蟮囊眉醋兞俊?/p>
【例2.6】 使用賦值語(yǔ)句把對(duì)象綁定到變量。

Python使用字面量表達(dá)式1、2和表達(dá)式a+b創(chuàng)建3個(gè)整型對(duì)象,并使用賦值語(yǔ)句把3個(gè)對(duì)象分別綁定到變量a、b和c。
字面量用于創(chuàng)建值為字面量的對(duì)象,即某個(gè)數(shù)據(jù)類型的實(shí)例對(duì)象;表達(dá)式使用運(yùn)算符實(shí)現(xiàn)多個(gè)操作數(shù)(對(duì)象)的運(yùn)算操作,并返回結(jié)果對(duì)象。用戶可以把對(duì)象通過(guò)賦值語(yǔ)句賦值給一個(gè)變量,即把對(duì)象綁定到一個(gè)變量,注意變量名必須為有效的標(biāo)識(shí)符。
在Python 3中,作為對(duì)象的函數(shù)和類等也可以通過(guò)變量引用,但這樣的引用一般意義不大,建議直接使用函數(shù)/類,以提高程序的可讀性。例如:

2.2.6 Python是動(dòng)態(tài)類型語(yǔ)言
Python是動(dòng)態(tài)類型語(yǔ)言,即變量不需要顯式聲明數(shù)據(jù)類型。根據(jù)變量的賦值,Python解釋器自動(dòng)確定其數(shù)據(jù)類型。
事實(shí)上,變量?jī)H用于指向某個(gè)類型對(duì)象,因此變量可以不限定類型,即可以指向任何類型的對(duì)象。
通過(guò)標(biāo)識(shí)符和賦值運(yùn)算符(=)可以指定某個(gè)變量指向某個(gè)對(duì)象,即引用該對(duì)象。多個(gè)變量可以引用同一個(gè)對(duì)象,一個(gè)變量也可以改變指向其他的對(duì)象。
【例2.7】 變量的動(dòng)態(tài)類型示例。

123為類int的對(duì)象實(shí)例,其id為140706558370656;a=123,即變量a指向(引用)對(duì)象實(shí)例123,故其id也為140706558370656;b=123,即變量b也指向(引用)對(duì)象實(shí)例123,故其id也為140706558370656;c=a,變量c和變量a一樣,指向(引用)對(duì)象實(shí)例123,其id同樣為140706558370656。a='abc',變量a指向(引用)對(duì)象實(shí)例'abc',其id為2529314137232。
2.2.7 Python是強(qiáng)類型語(yǔ)言
Python是一種強(qiáng)類型語(yǔ)言,每個(gè)變量指向的對(duì)象均屬于某個(gè)數(shù)據(jù)類型,即只支持該類型允許的運(yùn)算操作。
【例2.8】 變量的強(qiáng)數(shù)據(jù)類型示例。

2.2.8 對(duì)象內(nèi)存示意圖
Python程序運(yùn)行時(shí)會(huì)在內(nèi)存中創(chuàng)建各種對(duì)象(位于堆內(nèi)存中),通過(guò)賦值語(yǔ)句可以將對(duì)象綁定到變量(位于棧內(nèi)存中),從而通過(guò)變量引用對(duì)象進(jìn)行各種操作。
多個(gè)變量可以引用同一個(gè)對(duì)象。如果一個(gè)對(duì)象不再被任何有效作用域中的變量引用,則會(huì)通過(guò)自動(dòng)垃圾回收機(jī)制回收該對(duì)象占用的內(nèi)存。
為了更好地理解Python對(duì)象和變量的作用機(jī)制,本書采用對(duì)象內(nèi)存示意圖進(jìn)行演示。
【例2.9】 變量增量運(yùn)算示例以及相應(yīng)的對(duì)象內(nèi)存示意圖。

第1條語(yǔ)句,創(chuàng)建一個(gè)值為100的int對(duì)象,并綁定到變量i;第2條語(yǔ)句,先計(jì)算表達(dá)式i+1的值,然后創(chuàng)建一個(gè)值為101的int對(duì)象,并綁定到變量i。
執(zhí)行各條語(yǔ)句后,其對(duì)象內(nèi)存示意圖如圖2-1所示。
注意:在執(zhí)行完第2條語(yǔ)句后,內(nèi)存中存在3個(gè)int對(duì)象,即100、1和101,變量i引用對(duì)象101,其他兩個(gè)對(duì)象沒(méi)有被任何變量引用,將被自動(dòng)垃圾回收器回收。
【例2.10】 交換兩個(gè)變量的示例以及相應(yīng)的對(duì)象內(nèi)存示意圖。

在執(zhí)行各條語(yǔ)句后,其對(duì)象內(nèi)存示意圖如圖2-2所示。

圖2-1 變量增量運(yùn)算示例的對(duì)象內(nèi)存示意圖

圖2-2 兩個(gè)變量交換示例的對(duì)象內(nèi)存示意圖
2.2.9 對(duì)象的值比較和引用判別
通過(guò)==運(yùn)算符可以判斷兩個(gè)變量指向的對(duì)象的值是否相同;通過(guò)is運(yùn)算符可以判斷兩個(gè)變量是否指向同一對(duì)象。
【例2.11】 對(duì)象的值比較(==)和引用判別(is)示例。

2.2.10 不可變對(duì)象和可變對(duì)象
Python 3對(duì)象可以分為不可變對(duì)象(immutable)和可變對(duì)象(mutable)。不可變對(duì)象一旦創(chuàng)建,其值就不能被修改;可變對(duì)象的值可以被修改。Python對(duì)象的可變性取決于其數(shù)據(jù)類型的設(shè)計(jì),即是否允許改變其值。
Python中的大部分對(duì)象都是不可變對(duì)象,例如int、str、complex等。變量是指向某個(gè)對(duì)象的引用,多個(gè)變量可以指向同一個(gè)對(duì)象。給變量重新賦值,并不改變?cè)紝?duì)象的值,只是創(chuàng)建一個(gè)新對(duì)象,并指向該變量。
【例2.12】 不可變對(duì)象示例。

對(duì)象本身的值可以改變的對(duì)象稱為可變對(duì)象(例如list、dict等)。
【例2.13】 可變對(duì)象示例。

- Hands-On Data Structures and Algorithms with JavaScript
- JavaScript 網(wǎng)頁(yè)編程從入門到精通 (清華社"視頻大講堂"大系·網(wǎng)絡(luò)開發(fā)視頻大講堂)
- Learning Informatica PowerCenter 10.x(Second Edition)
- 教孩子學(xué)編程:C++入門圖解
- 精通MATLAB(第3版)
- C#程序設(shè)計(jì)(項(xiàng)目教學(xué)版)
- Learning Hadoop 2
- OpenCV with Python By Example
- Web Developer's Reference Guide
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)(第二版)
- Python網(wǎng)絡(luò)爬蟲實(shí)例教程(視頻講解版)
- Learning Kotlin by building Android Applications
- 計(jì)算機(jī)組裝與維護(hù)(第二版)
- 你好!Python
- Hands-On Design Patterns with Kotlin