=
fa riferimento, utilizzando [:]
si crea una copia. Per le stringhe, che sono immutabili, questo non importa, ma per gli elenchi ecc. È fondamentale.
>>> s = 'hello'
>>> t1 = s
>>> t2 = s[:]
>>> print s, t1, t2
hello hello hello
>>> s = 'good bye'
>>> print s, t1, t2
good bye hello hello
ma:
>>> li1 = [1,2]
>>> li = [1,2]
>>> li1 = li
>>> li2 = li[:]
>>> print li, li1, li2
[1, 2] [1, 2] [1, 2]
>>> li[0] = 0
>>> print li, li1, li2
[0, 2] [0, 2] [1, 2]
Allora perché lo usano quando si tratta con le stringhe? Le stringhe incorporate sono immutabili, ma ogni volta che scrivi una funzione di libreria che prevede una stringa, un utente potrebbe darti qualcosa che "assomiglia ad una stringa" e "si comporta come una stringa", ma è un tipo personalizzato. Questo tipo potrebbe essere mutabile, quindi è meglio prendersene cura.
Tale tipo potrebbe sembrare:
class MutableString(object):
def __init__(self, s):
self._characters = [c for c in s]
def __str__(self):
return "".join(self._characters)
def __repr__(self):
return "MutableString(\"%s\")" % str(self)
def __getattr__(self, name):
return str(self).__getattribute__(name)
def __len__(self):
return len(self._characters)
def __getitem__(self, index):
return self._characters[index]
def __setitem__(self, index, value):
self._characters[index] = value
def __getslice__(self, start, end=-1, stride=1):
return str(self)[start:end:stride]
if __name__ == "__main__":
m = MutableString("Hello")
print m
print len(m)
print m.find("o")
print m.find("x")
print m.replace("e", "a") #translate to german ;-)
print m
print m[3]
m[1] = "a"
print m
print m[:]
copy1 = m
copy2 = m[:]
print m, copy1, copy2
m[1] = "X"
print m, copy1, copy2
Disclaimer: Questo è solo un esempio per mostrare come potrebbe funzionare e per motivare l'uso di [:]
. Non è testato, incompleto e probabilmente è orribilmente performante
Non sarei d'accordo con la frase, questo non è il modo pitone per copiare una stringa. Sei corretto che useresti semplicemente un '='. Per le liste è una storia diversa. – wim