首页 > 解决方案 > Python数组元素赋值

问题描述

我对 Python 中一个关于数组变量赋值的简单案例感到困惑,希望有人能帮我检查一下。

在我的理解中,如果a是一个列表,b只是复制了a的引用,当你编辑b时,a也会被修改。同时,您可以使用is运算符来检查他们的 id。例如:

a = ["a", ["a", "b"]]
b = a[1]
b.append("c")

然后,它会返回True,当我使用

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 和引用,这意味着它们是独立的,但现在似乎不对,有人可以帮我检查一下吗?

非常感谢!

标签: pythonarrayscopy

解决方案


访问数组的一部分会创建一个视图。b并且a[0,:]是不同的视图,即使它们查看数组的相同部分a,所以即使它们的基础引用相同,它们的 id 值也是不同的。

对象的 id 在技术上与其引用的对象不同,因此具有相同 id 的对象将引用相同的数据,但具有相同引用的对象不一定具有相同的 id


推荐阅读