Как уже отмечали люди, это всегда должно быть верно для строк, созданных в python (или CPython, в любом случае), но если вы используете расширение C, это не будет иметь место.
В качестве быстрого контрпримера:
import numpy as np
x = 's'
y = np.array(['s'], dtype='|S1')
print x
print y[0]
print 'x is y[0] -->', x is y[0]
print 'x == y[0] -->', x == y[0]
Это дает:
s
s
x is y[0] --> False
x == y[0] --> True
Конечно, если ничто не использовало расширение C любого рода, вы 'Вероятно, это безопасно ... Я бы не рассчитывал на это, хотя ...
Редактировать: В качестве еще более простого примера, он не будет иметь место, если вещи были засолены или упакованы с struct
в любомway.
например:
import pickle
x = 's'
pickle.dump(x, file('test', 'w'))
y = pickle.load(file('test', 'r'))
print x is y
print x == y
Также (с использованием другой буквы для ясности, поскольку нам нужно "s"
для строки форматирования):
import struct
x = 'a'
y = struct.pack('s', x)
print x is y
print x == y