Python身份運算子:了解 'is' 和 'is not'

歡迎,未來的Python程序設計師!今天,我們將深入探討Python的一個非常吸引人的方面:身份運算子。如果你是編程新手,別擔心;我會一步一步引導你理解這個概念,就像我過去幾年教學中以數不清的學生所做的那樣。所以,拿起一杯你最喜歡的飲料,讓我們一起踏上這段令人興奮的旅程吧!

Python - Identity Operators

Python身份運算子是什麼?

在我們深入細節之前,先來了解身份運算子是關於什麼的。在Python中,身份運算子用於比較兩個對象的記憶體位置。它們不比較對象的值,而是檢查這些對象是否實際上是記憶體中的同一個對象。

這樣想吧:想像你和你的朋友都有紅色自行車。它們可能看起來一樣,但並不是同一輛自行車。這就是身份運算子在Python中幫助我們進行的區分。

Python有兩個身份運算子:

運算子 描述
is 如果兩個操作數指的是同一個對象,則返回True
is not 如果兩個操作數指的不是同一個對象,則返回True

現在,讓我們詳細看看每一個運算子。

Python的 'is' 運算子

'is' 運算子檢查兩個對象是否有相同的身份,這意味著它們佔用同一個記憶體位置。如果對象是相同的,則返回True,否則返回False。

來看看一些例子:

# 示例1:比較整數
a = 5
b = 5
print(a is b)  # 輸出:True

# 示例2:比較列表
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 is list2)  # 輸出:False

# 示例3:與None比較
x = None
print(x is None)  # 輸出:True

讓我們來分解這些例子:

  1. 在第一個例子中,'a' 和 'b' 都被賦予值5。Python通過使小整數(通常為-5到256)共享同一個記憶體位置來優化記憶體。所以,'a' 和 'b' 實際上指的是記憶體中的同一個對象,使得 'a is b' 返回True。

  2. 在第二個例子中,即使list1和list2包含相同的值,它們也是記憶體中的兩個獨立對象。這就是為什麼 'list1 is list2' 返回False。

  3. 在第三個例子中,'None' 是Python中的一個特殊單例對象。任何賦值為None的變量都將始终引用這個相同的對象,所以 'x is None' 返回True。

Python的 'is not' 運算子

'is not' 運算子只是 'is' 運算子的否定。如果對象不是記憶體中的同一個對象,則它返回True,如果它們是,則返回False。

來看看一些例子:

# 示例1:比較字符串
str1 = "Hello"
str2 = "Hello"
print(str1 is not str2)  # 輸出:False

# 示例2:再次比較列表
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 is not list2)  # 輸出:True

# 示例3:與None比較
y = 10
print(y is not None)  # 輸出:True

讓我們分析這些例子:

  1. 在第一個例子中,Python對小字符串進行記憶體優化,使str1和str2參考同一個對象。因此,'str1 is not str2' 返回False。

  2. 在第二個例子中,正如我們之前所看到的,list1和list2是記憶體中的獨立對象,所以 'list1 is not list2' 返回True。

  3. 在第三個例子中,y被賦予值10,這不是None。因此,'y is not None' 返回True。

Python身份運算子的實際例子與解釋

現在我們已經 cover 了基礎知識,讓我們來看看一些更實際的例子,以加強我們的理解。

# 示例1:函數返回None
def greet(name=None):
if name is not None:
return f"Hello, {name}!"
else:
return "Hello, stranger!"

print(greet())  # 輸出:Hello, stranger!
print(greet("Alice"))  # 輸出:Hello, Alice!

# 示例2:檢查空集合
empty_list = []
if empty_list is not None and len(empty_list) == 0:
print("The list is empty but not None")

# 示例3:對象比較
class Person:
def __init__(self, name):
self.name = name

person1 = Person("Bob")
person2 = Person("Bob")
person3 = person1

print(person1 is person2)  # 輸出:False
print(person1 is person3)  # 輸出:True

讓我們來分解這些例子:

  1. 在第一個例子中,我們使用 'is not None' 來檢查是否為我們的greet函數提供了名稱。在Python中,這是一種常見的模式,用於處理可選參數。

  2. 第二個例子展示了我們如何將 'is not None' 與其他檢查結合使用。在這裡,我們確保我們的列表存在(不是None)且為空。

  3. 第三個例子演示了 'is' 在自定義對象上的行為。即使person1和person2有相同的名字,它們也是記憶體中的不同對象。但是,person3被賦予與person1相同的對象,所以 'person1 is person3' 返回True。

結論

就是這樣,各位!我們已經穿越了Python身份運算子的領域。請記住,'is' 和 'is not' 是關於身份,而不是等價。它們檢查對象是否是記憶體中的同一個對象,而不是它們是否有相同的值。

在我教學的這些年裡,我發現學生經常會將 'is' 與 '==' 混淆。這是我用來幫助記憶的一個小頌歌:"Is用於身份,等於等於用於等價!"

練習這些運算子,四處嘗試不同的例子,你很快就能像專業人士一樣使用它們了。編程愉快,並且記住:在Python中,就像在生活中一樣,重要的不僅僅是某件事是什麼,而是它在哪裡!

Credits: Image by storyset