=
コピーを作成することにより、参照[:]
を作成します。不変の文字列の場合、これは実際には重要ではありませんが、リストなどの場合は重要です。
>>> s = 'hello'
>>> t1 = s
>>> t2 = s[:]
>>> print s, t1, t2
hello hello hello
>>> s = 'good bye'
>>> print s, t1, t2
good bye hello hello
しかし:
>>> 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]
では、なぜ文字列を扱うときにそれを使用するのでしょうか?組み込みの文字列は不変ですが、文字列を期待するライブラリ関数を作成するときはいつでも、ユーザーは「文字列のように見える」「文字列のように動作する」がカスタムタイプであるものを提供する場合があります。このタイプは変更可能である可能性があるため、注意することをお勧めします。
このようなタイプは次のようになります。
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
免責事項:これは、それがどのように機能するかを示し、の使用を動機付けるための単なるサンプルです[:]
。それはテストされておらず、不完全で、恐らく恐ろしいほどのパフォーマンスを発揮します