我理解基本的python引用,比如a + = b和a = a + b之间的区别,但这让我感到困惑.
import numpy as np
arr1 = np.arange(6).reshape(2,3)
arr2 = arr1[0]
arr2 is arr1[0] #returns False, when I expect True
arr1[0] = [7,8,9]
arr2 #[7,8,9], when I expect [0,1,2] since the 'is' returned False
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
索引numpy数组时,会创建一个新视图(它本身就是一个numpy数组).这是一个不同的对象,因此is失败了,但它是一个真实地 - 实际上在硬件上的内存的视图.修改该视图时,您可以修改可能存在其他视图的内存位.
编辑:通过检查数组的ctypes.data属性,您实际上可以看到与numpy数组关联的内存的起始地址.
In [1]: import numpy as np
In [2]: arr1 = np.arange(6).reshape(2,3)
In [3]: arr2 = arr1[0]
In [4]: arr2.ctypes.data
Out[4]: 39390224
In [5]: arr1[0].ctypes.data
Out[5]: 39390224
Run Code Online (Sandbox Code Playgroud)
相同!
您混淆了is,=和==运算符。
is进行身份检查。用它来查看两个变量是否实际上指向同一个对象,而不仅仅是具有相同的值=是赋值运算符。它为变量(或切片,如您的情况)分配一个值。==是相等运算符。它检查两个对象是否具有相同的语义值。所以在你的情况下:
arr2 == arr[0] # now should return True
Run Code Online (Sandbox Code Playgroud)
当您从数组中读取值时,Numpy 似乎会创建新对象。因此,每次读取时,都会创建一个新对象。因此两次读取生成的对象不同,因此is给出False结果。
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |