我无法在python中正确地将我想要的值分配给一个变量[重复]

Posted

技术标签:

【中文标题】我无法在python中正确地将我想要的值分配给一个变量[重复]【英文标题】:I can't assign my desired value to a variable properly in python [duplicate] 【发布时间】:2021-05-12 09:26:32 【问题描述】:

我想操纵矩阵“b”,但由于我已将其初始值指定为等于矩阵“a”的初始值,因此矩阵“a”也被操纵,这是不希望的。我该如何解决这个问题?

import numpy as np
a=np.zeros((3,3))
b=a
b[0,:]=1
print('a=',a,'\n')

print('b=',b)

这段代码的结果是这样的:

a= [[1. 1. 1.]
 [0. 0. 0.]
 [0. 0. 0.]] 

b= [[1. 1. 1.]
 [0. 0. 0.]
 [0. 0. 0.]]

如您所见,这两个矩阵都已修改。我写了这个小代码来说明我的问题。我的主程序是一个更大的程序,但我已经认识到这个问题,就是这样。

【问题讨论】:

numpy 数组只有一个。那是你的问题。 b = a 从不创建副本 【参考方案1】:

由于数组 a 和 b 在 python 中都是可变对象,一个简单的 = 使它们指向内存中的相同位置——因此,对a 的更改也会导致对b 的更改。这称为浅拷贝

您正在寻找的是深拷贝

b = a.copy()

有关浅拷贝和深拷贝的更多详细信息,请参阅 this tutorial,或 this one。

int、float等内置类型在python中是不可变的对象,所以没有浅拷贝。

【讨论】:

everything是python中的一个对象 是的,感谢您的澄清。对于 int 或 float 等不可变对象,= 在内存中创建一个单独的(深)副本,没有浅副本。 极客教程中的术语是错误的。在numpy 中,view 不应被称为“浅拷贝”。 array.copy() 不是“深拷贝”。 copy 模块有一个 deepcopy,对于 numpy,只有当 dtype 是对象时才重要。 a = b 不是任何类型的副本,无论是否浅薄。它只是让a 引用与b 相同的对象。 OP被这种区别所困扰。但是对于numpy 数组,我们还需要区分viewcopy docs.python.org/3/library/copy.html - 用于区分 copydeepcopycopy 模块中实现。【参考方案2】:

b = a 应该是 b = a.copy()

import numpy as np

a = np.zeros((3,3))
b = a.copy()
b[0,:] = 1
print('a = ',a,'\n')
print('b = ',b)
a = [[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]] 
b = [[1. 1. 1.]
 [0. 0. 0.]
 [0. 0. 0.]]

【讨论】:

以上是关于我无法在python中正确地将我想要的值分配给一个变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法正确地将此嵌套对象设置在不可变记录中

将我文件的每一行的值分配给一个数组[重复]

如何正确地将值分配给数组(结构类型)元素?

正确地将我的按钮链接到我的视图(在 UINavigationController 中)?

Python/MatPlotLib:无法在 y 轴上打印正确的数据

如何正确地将 ComboBox 的模型从 python (pyQt5) 传递给 QML?