Operatori di Identità in Python: Capire 'is' e 'is not'

Benvenuti, futuri programmatori Python! Oggi esploreremo un aspetto affascinante di Python: gli Operatori di Identità. Non preoccupatevi se siete nuovi alla programmazione; vi guiderò passo per passo attraverso questo concetto, proprio come ho fatto per innumerevoli studenti durante i miei anni di insegnamento. Prendete una tazza del vostro bevanda preferita e iniziamo questo avventuroso viaggio insieme!

Python - Identity Operators

Cos'sono gli Operatori di Identità in Python?

Prima di entrare nei dettagli, vediamo di cosa si tratta gli operatori di identità. In Python, gli operatori di identità sono utilizzati per confrontare le posizioni di memoria di due oggetti. Non confrontano i valori degli oggetti, ma verificano se gli oggetti sono effettivamente lo stesso oggetto in memoria.

Immaginațielo così: pensate a voi e al vostro amico che avete entrambi biciclette rosse. Potrebbero sembrare identiche, ma non sono la stessa bicicletta. Questo è il tipo di distinzione che gli operatori di identità ci aiutano a fare in Python.

Python ha due operatori di identità:

Operatore Descrizione
is Restituisce True se entrambi gli operandi si riferiscono allo stesso oggetto
is not Restituisce True se entrambi gli operandi non si riferiscono allo stesso oggetto

Ora, esaminiamo ciascuno di questi operatori in dettaglio.

L'Operatore 'is' di Python

L'operatore 'is' verifica se due oggetti hanno la stessa identità, il che significa che occupano la stessa posizione di memoria. Restituisce True se gli oggetti sono identici, e False altrimenti.

Ecco alcuni esempi:

# Esempio 1: Confronto di interi
a = 5
b = 5
print(a is b)  # Output: True

# Esempio 2: Confronto di liste
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 is list2)  # Output: False

# Esempio 3: Confronto con None
x = None
print(x is None)  # Output: True

Analizziamo questi esempi:

  1. Nel primo esempio, 'a' e 'b' sono entrambi assegnati al valore 5. Python ottimizza la memoria facendo condividere la stessa posizione di memoria agli interi piccoli (tipicamente da -5 a 256). Quindi, 'a' e 'b' si riferiscono effettivamente allo stesso oggetto in memoria, rendendo 'a is b' True.

  2. Nel secondo esempio, anche se list1 e list2 contengono gli stessi valori, sono due oggetti separati in memoria. Ecco perché 'list1 is list2' restituisce False.

  3. Nel terzo esempio, 'None' è un oggetto singleton speciale in Python. Ogni variabile assegnata None si riferirà sempre a questo stesso oggetto, quindi 'x is None' restituisce True.

L'Operatore 'is not' di Python

L'operatore 'is not' è semplicemente la negazione dell'operatore 'is'. Restituisce True se gli oggetti non sono lo stesso oggetto in memoria, e False se lo sono.

Ecco alcuni esempi:

# Esempio 1: Confronto di stringhe
str1 = "Hello"
str2 = "Hello"
print(str1 is not str2)  # Output: False

# Esempio 2: Confronto di liste di nuovo
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 is not list2)  # Output: True

# Esempio 3: Confronto con None
y = 10
print(y is not None)  # Output: True

Analizziamo questi esempi:

  1. Nel primo esempio, Python ottimizza la memoria per le stringhe piccole, facendo si che str1 e str2 si riferiscano allo stesso oggetto. Pertanto, 'str1 is not str2' restituisce False.

  2. Nel secondo esempio, come abbiamo visto prima, list1 e list2 sono oggetti separati in memoria, quindi 'list1 is not list2' restituisce True.

  3. Nel terzo esempio, y è assegnato al valore 10, che non è None. Pertanto, 'y is not None' restituisce True.

Esempi Pratici degli Operatori di Identità in Python con Spiegazioni

Ora che abbiamo coperto la base, vediamo alcuni esempi più pratici per consolidare la nostra comprensione.

# Esempio 1: Funzione che restituisce None
def greet(name=None):
if name is not None:
return f"Ciao, {name}!"
else:
return "Ciao, estraneo!"

print(greet())  # Output: Ciao, estraneo!
print(greet("Alice"))  # Output: Ciao, Alice!

# Esempio 2: Controllo delle collezioni vuote
empty_list = []
if empty_list is not None and len(empty_list) == 0:
print("La lista è vuota ma non None")

# Esempio 3: Confronto di oggetti
class Person:
def __init__(self, name):
self.name = name

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

print(person1 is person2)  # Output: False
print(person1 is person3)  # Output: True

Analizziamo questi esempi:

  1. Nel primo esempio, utilizziamo 'is not None' per verificare se un nome è stato fornito alla nostra funzione greet. Questo è un pattern comune in Python per gestire i parametri opzionali.

  2. Nel secondo esempio, mostriamo come possiamo utilizzare 'is not None' in combinazione con altri controlli. Qui, stiamo assicurando che la nostra lista esista (non sia None) e sia vuota.

  3. Il terzo esempio dimostra come 'is' si comporta con oggetti personalizzati. Anche se person1 e person2 hanno lo stesso nome, sono oggetti diversi in memoria. Tuttavia, person3 è assegnato allo stesso oggetto di person1, quindi 'person1 is person3' restituisce True.

Conclusione

Ed eccoci qui, ragazzi! Abbiamo esplorato la terra degli Operatori di Identità in Python. Ricordate, 'is' e 'is not' riguardano l'identità, non l'uguaglianza. Stanno controllando se gli oggetti sono esattamente lo stesso oggetto in memoria, non se hanno lo stesso valore.

Nei miei anni di insegnamento, ho trovato che gli studenti spesso confondono 'is' con '=='. Ecco una piccola rima che utilizzo per aiutare a ricordare: "Is è per identità, uguale uguale per uguaglianza!"

Pratica con questi operatori, gioca con diversi esempi, e presto li utilizzerai come un professionista. Buon coding, e ricorda: in Python, come nella vita, non si tratta solo di cosa sia qualcosa, ma di dove sia che conta!

Credits: Image by storyset