我无法在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
数组,我们还需要区分view
和copy
。
docs.python.org/3/library/copy.html - 用于区分 copy
和 deepcopy
在 copy
模块中实现。【参考方案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 中)?