4 ms·
Slicing in Python always create a new object. You can test it with a list of integers..
by Erlangen 6y ago
Slicing in Python always create a new object. You can test it with a list of integers..
- ianhorn 6y agoIt'll always create a new object but my understanding is that at least in numpy the new and old object will share memory. Am I wrong there too?
- dialamac 6y agoCPython is pretty terrible. Numpy has the concept of views, cpython doesn’t do anything sophisticated.
- aidos 6y agoCorrect. In Numpy the slices are views on the underlying memory. That’s why they’re so fast, there’s no copying involved. Incidentally that’s also why freeing up the original variable doesn’t release the memory (the slices are still using it).
- masklinn 6y ago> Slicing in Python always create a new object. It always creates a new object but it doesn't necessarily copy the contents (even shallowly). For instance slicing a `memoryview` creates a subview which shares storage with its parent.
- cecilpl2 6y agoMy favorite example of something similar to this, since you brought it up: >>> a = [254, 255, 256, 257, 258] >>> b = [254, 255, 256, 257, 258] >>> for i in range(5): print(a[i] is b[i]) ... True True True False False In Python, integers in the range [-5, 256] are statically constructed in the interpreter and refer to fixed instances of objects. All other integers are created dynamically and refer to a new object each time they are created.
- mark-r 6y agoLeaky abstractions at its finest.
- sullyj3 6y agoI mean, people should be using `==` for this. The fact that `is` happens to work for small numbers is an implementation detail that shouldn't be relied upon.
- mark-r 6y agoAbsolutely. But because it does work they might start using it without knowing it's wrong, then be surprised when it doesn't work. Python has other areas where the common English definition of a word leads to misunderstandings about how they're to be used.
- kgm 6y agoThough "when" the object is created isn't always so straightforward: >>> x = 257 >>> y = 257 >>> x is y False >>> def f(): ... x = 257 ... y = 257 ... return x is y ... >>> f() True The lesson being that `is` is essentially meaningless for immutable objects, and to always use `==`.
- pansa2 6y ago> `is` is essentially meaningless for immutable objects OTOH it’s recommended to use `is` rather than `==` when comparing to “singletons like `None`”. https://www.python.org/dev/peps/pep-0008/#programming-recommendations https://www.python.org/dev/peps/pep-0008/#programming-recomm...
- joppy 6y agoWhat is the rationale behind this? '==' works all the time, and 'is' only works sometimes. Using 'is' wherever possible requires the user to know some rather arbitrary language details (which objects are singletons and which are not), wheras '==' will always give the correct answer regardless.
- throwaway287391 6y ago> Slicing in Python always create a new object. Since you said "always", I'll be "that guy"... For the builtin types, yeah. But not in general; user code can do whatever it wants: class MyType: def __getitem__(self, *args): return self my_obj = MyType() my_other_obj = my_obj[3:7] assert my_other_obj is my_obj