list和numpy.ndarray切片赋值之不同
- 实验1,通过中间变量接收list的切片,并改变切片的值,查看原list和中间变量的值.
lst = [1, 2, 3]
temp1 = lst[:]
print(temp1)
temp1[0] = 9
print(temp1)
print(lst)
[1, 2, 3]
[9, 2, 3]
[1, 2, 3] # 可见原list并没有随着中间变量的某些值的改变而改变
- 实验2,通过中间变量接收ndarray类型的切片,并改变切片的值,查看原array和中间变量的值。
import numpy as np
lst = [1, 2, 3]
arr1 = np.array(lst)
temp2 = arr1[:]
print(temp2)
temp2[0] = 9
print(temp2)
print(arr1)
print("*" * 20)
arr2 = np.array(lst)
temp3 = arr2[1:]
print(temp3)
temp3[0:] = 9
print(temp3)
print(arr2)
[1 2 3]
[9 2 3]
[9 2 3] # 原array的原切片部分随着中间变量的索引值改变而改变
********************
[2 3]
[9 9]
[1 9 9] # 原array的原切片部分随着中间变量的切片值改变而改变
总结,将list切片作为一个中间变量,并改变之(通过切片或索引改变),无法改变原list,必须直接对list切片赋值才能改变原list(很容易验证),而numpy.ndarray可以将切片赋予一个临时变量,然后对该变量的切片形式进行赋值就可以改变原来的array,就是说,那个临时变量是原array的视图。但是要注意对临时变量的改变是通过索引或切片形式,而不是直接对临时变量赋值,那样的话,临时变量的地址空间就直接改变了,不能代表原array的视图了。