赋值号"="到底干了些什么?

本文通过实例对比了Python与C++中赋值操作的不同机制,特别是针对Python中的引用赋值特性进行了深入探讨,并解释了可变与不可变对象的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先贴上之前关于python的一点想法。今天感觉python对于不会编程渣又要搞装作搞科研的我是多么的重要,花个周末爱上ta吧。
之前搞过一点C++,今天看python总觉得怪怪的,赋值号是这种别扭的一个重要的点。
说清楚这件事,需要两门课,编译原理和程序语言原理,碰巧都没学过。。。那只能不专业的说一点了。

python

这种不适来自哪里呢?

>>> c={"zhang":"100"}
>>> c
{'zhang': '100'}
>>> c["wang"]="99"
>>> c
{'wang': '99', 'zhang': '100'}
>>> c['li']="90"
>>> c
{'li': '90', 'wang': '99', 'zhang': '100'}
>>> d=c
>>> c
{'li': '90', 'wang': '99', 'zhang': '100'}
>>> d
{'li': '90', 'wang': '99', 'zhang': '100'}
>>> id(c)
62091312
>>> id(d)
62091312
>>> c["zhao"]="97"
>>> c
{'zhao': '97', 'li': '90', 'wang': '99', 'zhang': '100'}
>>> d
{'zhao': '97', 'li': '90', 'wang': '99', 'zhang': '100'}

what the fuck!!! 在C++中,这根本就不能算是一个复制。因为复制完之后,c和d应该是解耦的。所以d=cd只是指向了原来得对象,而没有创立原来的对象。

所以,对python而言,赋值就是建立一个对象的引用。
所以,就有了原来那篇文章中可变对象和不可变对象不一样的错觉。是这样的,对于list和dict这两个可变对象而言,通过类似于上述代码的原地操作,直接了当的说明了上述问题。而对于num、tuple和string类型,由于不能原地操作,只能重新赋值,然而须知,赋值号的右值本身却是另外一个对象了。对于,python这样一款动态语言,解绑和重新绑定是再自然不过了。

C++

c++不做多说,跑了一个demo,一切尽在意料之中。
注意:没有指针才能这么潇洒,有指针的情况下当心悬挂指针,野指针很浪的!!!

#include <iostream>
#include <string>
using namespace std;

class Person {
public:
    string name;
    int grade;
    Person(string a="none", int b=0)
    {
        name=a;
        grade = b;
    }
};

int main()
{
    Person zhang("zhang", 100);
    Person wang, li;
    cout << zhang.name << " " << zhang.grade << endl;
    cout << wang.name << " " << wang.grade << endl;
    wang = zhang;
    cout << zhang.name << " " << zhang.grade << endl;
    cout << wang.name << " " << wang.grade << endl;
    wang.name = "wang";
    wang.grade = 99;
    cout << zhang.name << " " << zhang.grade << endl;
    cout << wang.name << " " << wang.grade << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值