47

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

4
  • 1
    Note that you can use itertools.islice for the latter. Commented Apr 19, 2011 at 20:16
  • 2
    When you ran it, and used id() to check the object identity, what did you learn? Commented Apr 19, 2011 at 20:19
  • 13
    @S.Lott: A view would have a different id() to the object it was a view of. So that doesn't actually teach you anything. Doing type() is more useful. Commented Apr 19, 2011 at 20:32
  • 1
    There are some useful answers in this duplicate question: stackoverflow.com/questions/64871329/… Commented Aug 30, 2024 at 17:56

2 Answers 2

69

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 a

With the slice-as-copy design the string a is 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.

Sign up to request clarification or add additional context in comments.

4 Comments

@BlueRaja-Danny-Pflughoeft What are the other possible kinds of trivial slices?
@sandeeps single-byte slices, empty slice
If I do 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 bytearray
0

When you slice strings, they return a new instance of String. Strings are immutable objects.

2 Comments

While true, this doesn't answer the question: he's asking if the data gets copied or not.
This is a reason why you'd expect slice views to not copy. One of the common uses for immutable data is it's easy to pass references instead. So I'm curious why in Python it does a copy.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.