1. 程式人生 > >Python中的引用比較、值比較與物件池

Python中的引用比較、值比較與物件池

主要內容:

  • Python裡的值比較用==,引用比較用is
  • Python與Java一樣,都有物件池

Python是一種很徹底的面向物件的語言

為會要說徹底呢? 因為是與Java相比。 Java雖說也是OOP的,但還保留了基本資料型別:int, long, double, float, etc.。而在Python裡,所有的變數都是以物件形式存在。

a = 1;
print(isinstance(a,object))
True

is 和 ==

我們一般都是通過操作物件的引用來操作物件,而物件的引用從本質上來說只是物件的地址值。在Java裡, obj1==obj2比較的是兩個變數的地址值,而它們所指向的值;要比較物件的值是否相同,應該使用obj1.equals(obj2)

. 而在Python裡, obj1==obj2比較的是兩個變數的值;若要比較它們的地址/id,則使用關鍵字is:

a = 1000
b = 1000
c = a
print(a == b)
print(c is a)
print(c is b)
True
True
False

物件池

(是不是叫這個名字不大確定)
若把上面例子中的1000改成100,你會發現一個奇怪的現象,變數c與變數b居然id也相等了

a = 100
b = 100
c = a
print(a == b)
print(c is a)
print(c is b)
True
True
True

Why? 熟悉Java的都知道,為了提高效率,JVM維護了一個共用的物件池。對整數來說,Java會將128以內(即0到127)的整數存在pool裡。若使用者要求建立一個128以內的Integer時,JVM不會真去建立一個新的物件, 而是直接從這個pool裡將對應整數物件的引用返回。而Python也有類似的機制,但範圍不是128以內了。讓我們寫段程式碼來找出這個範圍:

def test(val):
    s = '%d'%(val)
    a = eval(s)
    b = eval(s)
    return (a is b)
for i in range(0, 512):
    if not test(i):
        print(i)
        break;
257

可見,Python將0~256放在了pool裡。

相關推薦

Python引用比較比較物件

主要內容: Python裡的值比較用==,引用比較用is Python與Java一樣,都有物件池 Python是一種很徹底的面向物件的語言 為會要說徹底呢? 因為是與Java相比。 Java雖說也是OOP的,但還保留了基本資料型別:int, long,

Python的複製淺拷貝深拷貝

1.物件的三要素 id、type以及value,id唯一標識一個物件,相當於地址,id一樣,說明就是同一個東西。type和value就是字面意思。 2.==和is ==比較的是value,is比較的是id,意思是  “是否為同一個物件”,條件比==要嚴格。 3.可變物

Python關於listtuple字符串的比較

用法 連接 paragraph ble 大寫 空間占用 rabl 長度 命名 List定義及常用的方法見上一篇博客。 Tuple元組tuple的定義: tuple是一個有序的元素組成的不可變對象的集合,使用小括號()表示,是可叠代對象 元組中數據的訪問

python閒談----關於Python列表的賦拷貝(淺拷貝深拷貝)操作

列表作為python中最重要也是最基礎的序列,以其簡單方便的操作被廣泛應用,但在引用列表時也要注意一些小坑,這裡討論一下關於列表賦值的操作。 《Fluent Python》的作者Luciano Ramalho將序列按照記憶體模型分為容器序列和扁平序列

C#泛型引用型別型別和Object的效能比較

最近在看C#的泛型,據CLR via C# (第4版)上的說明,泛型是最優的。 對此,先秉持著懷疑的心態的看問題,先驗證一下是否如此。 以下在Main()中實現了個示例,例證的思路是:通過多次執行呼叫,統計並比較不同型別呼叫的時間。 static void M

C#的棧和堆型別引用型別引數引用引數輸出引數引數陣列

程式執行時,資料必須儲存在記憶體中,一個數據需要多大的記憶體、儲存的位置、如何儲存依賴於該資料的資料型別。執行中的程式使用兩個記憶體區域來儲存資料:棧和堆。 棧:                 棧是一

python的is==和cmp()比較字串

python 中的is、==和cmp(),比較字串 經常寫 shell 指令碼知道,字串判斷可以用 =,!= 數字的判斷是 -eq,-ne 等,但是 Python 確不是這樣子地。所以作為慢慢要轉換到用 Python 寫指令碼,這些基本的東西必須要掌握到骨子裡! 在 Python 中比較字串最好是使用簡單邏輯

Python的可變不可變對象和賦技巧序列解包

lis 我們 最大 pac 唯一標識 src 技術分享 efault pre 可變對象和不可變對象 在python中一切皆對象。在Python中不存在所謂的值傳遞調用,一切傳遞都是對象的引用,也可認為是傳址。 python中,對象分為可變(mutable)和不可變(imm

Java和Pythonfor循環的比較

Java和Python中for循環的比較Java是強類型的語言,而python是弱類型的語言。先看Java中的for循環使用,如下圖: package test06; /* * for 循環的條件 * for (循環初始表達式;循環條件表達式;循環後的表達式) */ public class Fort

Python多目標賦及共享引用的問題

多目標賦值語句就是直接把所有提供的變數名都賦值給右側的物件。  >>> a = b = c = "spam" # 將字串"spam"同時賦值給a,b,c >>> a,b,c ('spam', 'spam', 'spam') >>

C# 二十四傳遞引用傳遞

值傳遞 使用值傳遞時,向形式引數傳遞的是實在引數的副本,方法內發生的對形式引數的更改對實在引數本身沒有任何影響。 程式碼示例: static void Main(string[] args) { int i =

Java語言的方法引數——傳遞引用傳遞

Java語言中的方法引數有兩種: 1、基本資料型別(數字、布林值) 2、物件引用 基於方法引數的傳遞有兩種方式:值傳遞和引用傳遞。 值傳遞表示方法接收的是呼叫者提供的值。 引用傳遞表示方法接收的是呼叫者提供的變數地址。 Java程式設計語言總是採用按值傳遞的方式,也就是說

C#方法引數的引用傳遞傳遞。

一、值型別和引用型別 C# 中的型別一共分為兩類,一類是值型別(Value Type),一類是引用型別(Reference Type)。 值型別包括結構體(struct)和列舉(enu

C#引用傳遞傳遞。

一、傳遞引數   既可以通過值也可以通過引用傳遞引數。通過引用傳遞引數允許函式成員(方法、屬性、索引器、運算子和建構函式)更改引數的值,並保持該更改。 二、傳遞值型別引數   值型別變數直接包含其資料,這與引用型別變數不同,後者包含對其資料的引用。因此,向方法傳遞值型別變

Python sorted 如何自定義比較邏輯

在 Python 中對一個可迭代物件進行排序是很常見的一個操作,一般會用到 sorted() 函式 ``` python num_list = [4, 2, 8, -9, 1, -3] sorted_num_list = sorted(num_list) print(sorted_num_list) ```

Python的列表元祖字典

value pop val 什麽 刪除 append 更新 位置 增刪改 一、列表 一組有序項目的集合。可變的數據類型【可進行增刪改查】 列表是以方括號“[]”包圍的數據集合,不同成員以“,”分隔。 列表中能夠包括不論什麽數據類型,也可包括還有一個列表 列表可通過序號訪

Python模塊的發布安裝

fix .tar.gz 沖突 lena python math port ... bsp 模塊(Module) Python中有一個概念叫做模塊(module),這個和C語言中的頭文件以及Java中的包很類似,比如在Python中要調用sqrt函數,必須用import

Python的lambdamapfilterreducezip

sum http seq 是你 解包 range 匿名函數 三元 param lambda lambda是匿名函數,也就是沒有名字的函數。lambda的語法非常簡單: 下面是一個lambda表達式的簡單例子: 註意:我們可以把lambda表達式賦值給一個變量,然後通過這個

Python裝飾器(Decorator)的理解進階

python decorator 裝飾器 有時候我們項目中的某些功能做些修改即需要對內部的某些函數添加一些附加功能,但是為了安全起見不想改變函數的源代碼以及函數的調用方式,那麽裝飾器在這個地方會給我們帶來很大的幫助。 裝飾器(Decorator):(又叫語法糖) 定義:本質是函數,功能(裝

Python列表(list)字典(dict)排序的程序

self. 能夠 網站 軟件 too 字段 tool 生成 ted Python3 中的排序,在 Sorting HOW TO 中已經講得很清楚了。來個實際的例子,對下面的這個 list 依據創建時間排序: pages = [{‘title‘: ‘十年學會程序設計‘, ‘