I have a question on how to create a sublist (I hope this is the right term to use) from this list without copying.
It seems that slicing can create sublists, but does it with copying. Here is an example.
In [1]: a = [1,2,3] In [2]: id(a) Out[2]: 4354651128 In [3]: b = a[0:2] In [4]: b Out[4]: [1, 2] In [5]: id(b) Out[5]: 4354621312 In [6]: id(a[0:2]) Out[6]: 4354620880
See here id of b and a [0: 2] are different, although their values ββare the same. To double check, change the value in a, the value in b will not change.
In [7]: a[1] = 4 In [8]: a Out[8]: [1, 4, 3] In [9]: b Out[9]: [1, 2]
So, to get back to my question, how can I create sub-lists, but without copying? I mean, when the value of a [1] is set to 4, b will be [1, 4].
I searched around and did not find much help (maybe I am not using the right keywords). Thanks!
Changes:
Thank you all for your comments and answers! Here is what I learned.
- In Python, there is no built-in way to create a list view (or create a sublist without copying).
- The easiest way to do this is to use a numpy array.
- Although the numpy array has data type limitations compared to a list, it does my job (to implement quicksort without extra memory).
Here is the same process with a numpy array.
In [1]: import numpy as np In [2]: a = np.arange(1,4) In [3]: a Out[3]: array([1, 2, 3]) In [4]: b = a[0:2] In [5]: b Out[5]: array([1, 2]) In [6]: id(b) Out[6]: 4361253952 In [7]: id(a[0:2]) Out[7]: 4361254032 In [8]: a[1] = 4 In [9]: a Out[9]: array([1, 4, 3]) In [10]: b Out[10]: array([1, 4])