I want to know if when I do something like
a = "This could be a very large string..."
b = a[:10]
a new string is created or a view/iterator is returned
Python does slice-by-copy, meaning every time you slice (except for very trivial slices, such as a[:]), it copies all of the data into a new string object.
According to one of the developers, this choice was made because
The [slice-by-reference] approach is more complicated, harder to implement and may lead to unexpected behavior.
For example:
a = "a long string with 500,000 chars ..." b = a[0] del aWith the slice-as-copy design the string
ais immediately freed. The slice-as-reference design would keep the 500kB string in memory although you are only interested in the first character.
Apparently, if you absolutely need a view into a string, you can use a memoryview object.
word='python' word[2:3] == word[2:-3], I get true. And if I compare id(word[2:3]) and id(word[2:-3]), they are the same. Does it means when slicing, python does some interning work for the identical strings?memoryview doesn't really help for strings, because it only works on objects which support the buffer protocol, like bytes and bytearrayWhen you slice strings, they return a new instance of String. Strings are immutable objects.
itertools.islicefor the latter.id()to check the object identity, what did you learn?id()to the object it was a view of. So that doesn't actually teach you anything. Doingtype()is more useful.