Sono stato morso usando l'operatore is
quando avrei dovuto usare ==
. Sono consapevole del fatto che il primo test per l'uguaglianza delle identità degli oggetti e che il secondo test per l'uguaglianza dei contenuti degli oggetti.
L'uso di is
, pensavo, verifica implicitamente anche l'uguaglianza dei contenuti. Ad esempio if a is b
è true, quindi i contenuti devono essere uguali. Questa era l'ipotesi di lavoro e credo che sia ancora vero. Ma ciò che è stato scoperto, e avrebbe dovuto essere noto, è che se if a is b
è falso, allora il contenuto di aeb può essere o meno lo stesso.
Esempio (Python 3.3.3):
class Food:
def favourite_restaurant(self):
return "the foo diner"
if __name__ == '__main__':
fr = "the juice bar"
print('%r is %r: %r' % (fr, 'the juice bar', (fr is 'the juice bar')))
print('%r == %r: %r' % (fr, 'the juice bar', (fr == 'the juice bar')))
f = Food()
result = f.favourite_restaurant()
print('%r is %r: %r' % (result, 'the foo diner', (result is 'the foo diner')))
print('%r == %r: %r' % (result, 'the foo diner', (result == 'the foo diner')))
Il primo blocco di stampa dice:
'the juice bar' is 'the juice bar': True
'the juice bar' == 'the juice bar': True
Il secondo blocco di stampa dice:
result: 'the foo diner'
'the foo diner' is 'the foo diner': False
'the foo diner' == 'the foo diner': True
Sembra che gli oggetti istanziati all'interno dell'istanza di una classe abbiano il proprio gruppo di id, separato dagli oggetti al di fuori della classe.
La mia comprensione del fatto che l'incapsulamento in python è davvero una questione di "adulti consenzienti". In realtà abbiamo incapsulamento ad un livello inferiore?