首先贴上之前关于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=c
d只是指向了原来得对象,而没有创立原来的对象。
所以,对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;
}