python物件 引用

2022-08-28 21:15:13 字數 2562 閱讀 4705

python中

所有的python物件都有3個特徵: 身份,型別和值

其它內建型別

核心筆記:布林值

none

false

所有的值為0的數

0(整型)

0.0(浮點型)

0l(長整型)

0.0 + 0

.0j (複數)

""空字串

空列表() 空元組

{} 空字典

bool() #bool

()函式測試

>>> bool

()false

值不是上面列出來的是true

物件身份的比較:is is not 物件就像乙個裝著內容的盒子(記憶體位址)。當乙個物件被賦值到乙個變數,就像在盒子上貼了乙個標籤 表示建立了乙個引用。每當這個物件有了新的引用,就會在盒子上新貼上一張標籤。當乙個引用被銷毀,標籤化就會 撕掉。而每個物件都有乙個引用計數器來記錄引用的次數,當引用為0,物件銷毀.

不可變資料物件:數字和字串,元組,不能改變物件本身(不能再當前記憶體位址對該物件改變,要獲得新的值的再開闢記憶體儲存物件),只能改變引用的指向,稱為不可變資料物件(immutable object)。

可變資料物件:可以通過引用其元素,改變物件自身(in-place change)。這種物件型別,稱為可變資料物件(mutable object),字典,列表,集合。

例子1:

>>> a = 2  #賦值就建立了乙個指向 物件 "2"  的引用a.

>>>id(a)  #物件 2 的記憶體位址

24834392

>>> a = '

banana

' #將 引用a 指向了物件『banana』.

>>>id(a) 

139990659655312

記憶體中建立了乙個字串物件『banana』,通過賦值 將 引用a 指向了 『banana』,同時,物件1不在有引用指向它,它會被python的記憶體處理機制給當我垃圾**,釋放記憶體。

例子2:

>>> a = 3

>>> b = 3

>>>id(a)

10289448

>>>id(b)

10289448

#物件 3 存在2個應用 a 和 b

例子3:

1.  a = 4

2.  b = a(這裡就是讓引用b指向引用a指向的那個物件)

3.  a = a + 2

>>> a = 4

>>> b =a

>>>id(a)

36151568

>>>id(b)

36151568

可以看到 a 和 b 都指向了 整數物件 4

>>> a = a+2

>>>id(a)

36151520

>>>id(b)

36151568

可以看到 a 的引用改變了,但是 b 的引用未發生改變;a,b指向不同的物件;第3句對 a 進行了重新賦值,讓它指向了新的 物件6;即使是多個引用指向同乙個物件

,如果乙個引用值發生變化,那麼實際上是讓這個引用指向乙個新的引用,並不影響其他的引用的指向。從效果上看,就是各個引用各自獨立,互不影響。

例子4: 可變物件引用

1.   l1 = [1, 2, 3]

2.   l2 = l1

3.   l1[0] = 10

當執行第1步 和 第二步 的時候,檢視一下 l1 和 l2 的引用情況:

>>> l1 = [1,2,3]

>>> l2 =l1

>>>id(l1)

139643051219496

>>>id(l2)

139643051219496此時 l1 和 l2 的引用相同,都是指向 [1,2,3]這個列表物件。

接下來,繼續執行第3步:

>>> l1[0] = 10

>>>id(l1)

139643051219496

>>>id(l2)

139643051219496

>>>l2

[10, 2, 3]

l1 和 l2 的引用沒有發生任何變化,但是 列表物件[1,2,3] 的值 變成了 [10,2,3](列表物件改變了)

我們不再對l1這一引用賦值,而是對l1所指向的表的元素賦值。結果是,l2也同時發生變化。

原因何在呢?因為l1,l2的指向沒有發生變化,依然指向那個表。表實際上是包含了多個引用的物件(每個引用是乙個元素,比如l1[0],l1[1]..., 每個引用指向乙個物件,

比如1,2,3), 。而l1[0] = 10這一賦值操作,並不是改變l1的指向,而是對l1[0], 也就是表物件的一部份(乙個元素),進行操作,所以所有指向該物件的引用都受到影響。

is關鍵字:

python的物件引用

首先,我們來了解一下python的基礎概念 1.python在heap中分配的物件分成兩類 可變物件和不可變物件。所謂可變物件是指,物件的內容是可變的,例如list。而不可變的物件則相反,表示其內容不可變。不可變物件 int,string,float,tuple 可變物件 list,dictiona...

python物件引用(變數)

python將所有資料存為記憶體物件 變數事實上是指向記憶體物件的引用 動態型別 在任何時刻,只要需要,某個物件引用都可以重新引用乙個不同的物件 可以是不同的資料型別 內建函式type 用於返回給定資料項的資料型別 等號用於將變數名和記憶體中的資料物件繫結,如果物件事先存在,則直接繫結,否則,建立引...

python物件引用的問題

python 動態的引用物件會出現一些比較奇怪的現象。如result listdict result dict foriinrange len result list ifi self.n break 執行結果是list中所以的元素都是最後dict中的值 如果想得到正確的結果,則需要改為 resul...