我对Python中关于数组变量赋值的一个简单例子感到困惑,希望有人能帮我检查一下。你知道吗
在我的理解中,如果a是一个列表,b只是复制了a的引用,当你编辑b时,a也会被修改。同时,您可以使用is
操作符来检查它们的id。例如:
a = ["a", ["a", "b"]]
b = a[1]
b.append("c")
然后,当我使用
In [7]: b is a[1]
Out[7]: True
但是,如果a和b是数组
import numpy as np
a = np.identity(3)
b = a[0, :]
之后,当我使用is
检查时,它返回False
,但是当我编辑b时,a也会被修改:
In [14]: b is a[1]
Out[14]: False
In [15]: a
Out[15]:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
In [16]: b
Out[16]: array([0., 1., 0.])
In [17]: b *= 2
In [18]: b
Out[18]: array([0., 2., 0.])
In [19]: a
Out[19]:
array([[1., 0., 0.],
[0., 2., 0.],
[0., 0., 1.]])
基本上,我认为如果is
返回False
,变量将有不同的id和引用,这意味着它们是独立的,但现在似乎不对,有人能帮我检查一下吗?你知道吗
非常感谢!你知道吗
访问数组的切片将创建一个视图。
b
和a[0,:]
是不同的视图,即使它们查看的是数组的相同部分a
,因此即使它们的底层引用相同,它们的id值也是不同的。你知道吗对象的id在技术上与它所引用的不同,因此具有相同id的对象将引用相同的数据,但是具有相同引用的对象不一定具有相同的id
Numpy数组的工作方式与Python列表不同。在您的示例中,b是a的第一行的numpy视图,它与指向第一个元素a的指针不同
顺便说一下,您可以通过执行
id(b)
或id(a[0])
来检查每个变量的id。你知道吗相关问题 更多 >
编程相关推荐