Python列表中的切片:
Microsoft Windows [版本 10.0.18363.1198]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\Users\chenxuqi>python
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> ls = [0,1,2,3,4,5,6,7,8,9]
>>> ls
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ls[0:3]
[0, 1, 2]
>>> ls2 = ls[0:3]
>>> ls2[0]= 44444
>>> ls2
[44444, 1, 2]
>>> ls
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ls[0:2] = [999,888]
>>> ls
[999, 888, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ls2
[44444, 1, 2]
>>>
>>>
NumPy中的切片:
Microsoft Windows [版本 10.0.18363.1198]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\Users\chenxuqi>python
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> ls = [0,1,2,3,4,5,6,7,8,9]
>>> ls
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ls = np.array(ls)
>>> ls
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> ls[0:3]
array([0, 1, 2])
>>> ls2 = ls[0:3]
>>> ls2
array([0, 1, 2])
>>> ls
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> ls
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> ls2
array([0, 1, 2])
>>> ls2[0]= 999
>>> ls2
array([999, 1, 2])
>>> ls
array([999, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> ls[0:2] = [777,888]
>>> ls
array([777, 888, 2, 3, 4, 5, 6, 7, 8, 9])
>>> ls2
array([777, 888, 2])
>>>
>>>
>>>
总结: 在Python中列表中的切片是进行了拷贝,切片后得到的是一个新的对象,和原列表变量相互独立,改变两者任意一个都不会影响到另一个.而NumPy就不同了,NumPy的切片并不是拷贝,它只是原对象的一个视图(view),并不会重新在内存中创建一个新对象,因此,改动任意一个对象都会影响到另一个对象,因为它们在内存上是共享的(这是NumPy为了更高效更节省内存资源而做的优化).
参考更多资料: Learn more about copies and views in NumPy here
参考链接: NumPy 副本和视图