博主在看某书上的python代码时产生疑问:为什么python不像c++,java一样支持变量的自加与自减操作呢?这样的话一些代码就会简洁不少,于是查找了一些资料,但是觉得都没有讲的很明白,这里把他们讲到的涉及的一些知识点介绍一下。
python与c++中数值变量存储机制的不同
我们先来看python的一段代码:
a = 5
print(" a = ",a,"地址为:",id(a))
a += 1
print("a+=1后 ","a = ",a,"地址为:",id(a))
b = 5
print(" b = ",b,"地址为:",id(b))
c = b
print(" c = ",c,"地址为:",id(c))
a = 5 地址为: 140451760084256
a+=1后 a = 6 地址为: 140451760084288
b = 5 地址为: 140451760084256
c = 5 地址为: 140451760084256
我们看到a+=1之后,a所指向的存储地址已经改变了,变量b和变量c都等于5,这两个变量所指向的地址为数值5所在的地址。
我们下面来看c++的一段类似的程序:
#include <iostream>
using namespace std;
int main()
{
int a = 5;
cout <<" a="<<a<<"地址为:"<< &a << '\n';
a++;
cout <<"a++后"<<" a="<<a<<"地址为:"<< &a<<'\n';
a+=1;
cout <<"a+=1后"<<" a="<<a<<"地址为:"<< &a<<'\n';
int b=5;
cout<< " b="<<b<<"地址为:"<<&b<<'\n';
int c = b;
cout<< " c="<<c<<"地址为:"<<&c;
return 0;
}
a=5地址为:0x7fff6ea1ea78
a++后 a=6地址为:0x7fff6ea1ea78
a+=1后 a=7地址为:0x7fff6ea1ea78
b=5地址为:0x7fff6ea1ea74
c=5地址为:0x7fff6ea1ea70
我们这里看到有明显的不同,a++与a+=1之后变量a所指向的地址并没有改变;虽然变量b=c=5但是这两个变量所指向的地址也并不是a所指向的那个地址。
综上我们发现:
C++
1.是以变量名字来分配内存地址的,只要数值的变量名字不同,那么它们就分配不同的地址。
2.a++与a+=1的操作下a所指向的内存空间都不会改变(也不需要改变,这样设计是合理的)
Python
1.Python中在某一个数值区间内会有一个整数池,无论你的整数叫什么名字,只要和池中某个整数值一样,那它俩就会分配为同一个存储空间,不同的变量名都指向了这个空间。
2.a+=1操作下,由于内容改变了,所以a所指向的内存空间也需要改变(如果所指向的内存空间不改变的话,而数值变量b也指向了这片空间,那么改变a的同时就改变了b,这不是我们希望的,所以变量a的指向必须改变,这样设计是合理的)。