Python和C++赋值共享内存、Python函数传址传值、一些其他的遇到的bug

2024-06-13 1312阅读

1、Numpy共享内存的情况:

array1 = np.array([1, 2, 3])
array2 = array1
array2[0] = 0       # array1也会跟着改变,就地操作
array2 = array2 * 2 # array2不会跟着改变,属于非就地操作,会创建一个新的地址给array2
array2 = array1[:]
array2 = array1.view()
array2 = array1.reshape((3, 1))

使用array.copy() 创建深拷贝以避免这种问题

Python和C++赋值共享内存、Python函数传址传值、一些其他的遇到的bug
(图片来源网络,侵删)

非就地操作:会创建一个新的数组,并将其赋值给 array2(指向的地址发生改变)。在这种情况下,array2 将引用一个新的数组,原来的 array2 不再共享原始的内存。如下,都不会影响到array1:

array2 = -array1 # 有运算时不共享(会创建一个新的数组给array2)
array2[0] = 0    # array1不会跟着改变
array2 = array1		# 共享内存
array2 = array2 + 1 # array1不会改变(此时创建一个新的数组给array2)。但array2 += 1会影响array1,自增是就地(in-place)操作
array2 = array1
array2[0] = -array2[0] # 就地操作,1会改
array2[:] = -array2[:] # 就地操作,1会改
array2 = -array2       # 非就地操作,1不改

2、pytorch共享内存的情况:

和Numpy完全一样

tensor1 = torch.tensor([1, 2, 3])
tensor2 = tensor1
tensor2[0] = 0 # tensor1也会跟着改变
tensor2 = tensor1.view(-1)
tensor2 = tensor1.detach()

使用tensor.clone()创建深拷贝以避免这种问题

3、Eigen中共享内存的情况:

Eigen::MatrixXd matrix1 = Eigen::MatrixXd::Random(3, 3);
Eigen::MatrixXd matrix2 = matrix1.block(0, 0, 2, 2);
Eigen::ArrayXd array1 = Eigen::ArrayXd::Random(5);
Eigen::ArrayXd array2 = array1.segment(1, 3);

直接进行赋值不会共享内存:

Eigen::VectorXd vector1 = Eigen::VectorXd::Random(5);
Eigen::VectorXd vector2 = vector1; // 不共享内存,vector2更改不影响vector1

4、List中共享内存的情况

Python当向列表中添加一个元素时,列表会存储对该元素的引用

a = np.array([1, 2, 3])
list_a = [a]
a[0] = 0 # list_a也会改变

C++中std::vector不会有这种情况:

int main() {
    Eigen::Vector3d A(0,0,0);
    std::vector vector_A;
    vector_A.push_back(A);
    A(0) = 1;	// vector_A不改
    std::cout 
public:
    int value;
    MyClass(int v) : value(v) {}
};
int main() {
    MyClass A(5);
    MyClass B = A; 
    B.value = 10;
    std::cout 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]