44

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

BlueRaja - Danny Pflughoeft
  • 84,206
  • 33
  • 197
  • 283
GuidoMB
  • 2,191
  • 3
  • 25
  • 40
  • 1
    Note that you can use `itertools.islice` for the latter. –  Apr 19 '11 at 20:16
  • 2
    When you ran it, and used `id()` to check the object identity, what did you learn? – S.Lott Apr 19 '11 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. – Thomas K Apr 19 '11 at 20:32

2 Answers2

64

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.

BlueRaja - Danny Pflughoeft
  • 84,206
  • 33
  • 197
  • 283
  • 1
    @BlueRaja-Danny-Pflughoeft What are the other possible kinds of trivial slices? – sandeeps Jun 24 '16 at 02:46
  • 1
    @sandeeps single-byte slices, empty slice – sshilovsky Jul 20 '17 at 07:59
  • 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? – WesternGun Oct 10 '17 at 15:00
  • 1
    `memoryview` doesn't really help for strings, because it only works on objects which support the buffer protocol, like `bytes` and `bytearray` – bsa Apr 22 '19 at 01:05
0

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

John Kugelman
  • 349,597
  • 67
  • 533
  • 578
Santiago Alessandri
  • 6,630
  • 30
  • 46
  • 10
    While true, this doesn't answer the question: he's asking if the data gets copied or not. – BlueRaja - Danny Pflughoeft Apr 19 '11 at 20:11
  • 12
    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. – sudo Mar 06 '18 at 03:10