python和c语言中的内存分配
我在看SO中的一个问题,然后看这个问题 我尝试在python中为a和b获得相同的id。但当我在c上尝试同样的方法时python和c语言中的内存分配,python,c,Python,C,我在看SO中的一个问题,然后看这个问题 我尝试在python中为a和b获得相同的id。但当我在c上尝试同样的方法时 main() { int a=4,b; b=2+2; printf("%p\n",&a); printf("%p",&b); } 但这印出了不同的价值观。为什么会有区别 等效Python代码的工作原理与您链接的问题中给出的几个答案相同-Python(或至少是CPython)恰好缓存了一些小的整数值-4就是其中之一,因此每个等于4的
main()
{
int a=4,b;
b=2+2;
printf("%p\n",&a);
printf("%p",&b);
}
但这印出了不同的价值观。为什么会有区别 等效Python代码的工作原理与您链接的问题中给出的几个答案相同-Python(或至少是CPython)恰好缓存了一些小的整数值-4就是其中之一,因此每个等于4的Python整数对象都是相同的对象,因此具有相同的
id
在C语言中,整数是可变的,因此编译器不能执行这种优化-如果你增加a
,你就不会期望b
发生变化,如果Python整数是可变的,a
和b
在等价代码中的id
也会不同
在实现级别上,
int
对C的意义与对Python的意义不同,即使它们恰好在程序中起到相同的作用。等效的Python代码的工作原理与您链接的问题-Python(或至少是CPython)中给出的几个答案相同碰巧缓存了一些小的整数值-4就是其中之一,因此每个等于4的Python整数对象都是相同的对象,因此具有相同的id
在C语言中,整数是可变的,因此编译器不能执行这种优化-如果你增加a
,你就不会期望b
发生变化,如果Python整数是可变的,a
和b
在等价代码中的id
也会不同
在实现级别上,
int
对C的意义与对Python的意义不同,即使它们恰好在程序中起到相同的作用。Python缓存一些小整数。来自python文档
当前实现为所有对象保留一个整数对象数组
介于-5和256之间的整数,当您在该范围内创建整数时
实际上,只需返回对现有对象的引用。所以
应该可以更改1的值。我怀疑这种行为
在本例中,Python的名称未定义。:-)
Python缓存一些小整数。来自python文档 当前实现为所有对象保留一个整数对象数组 介于-5和256之间的整数,当您在该范围内创建整数时 实际上,只需返回对现有对象的引用。所以 应该可以更改1的值。我怀疑这种行为 在本例中,Python的名称未定义。:-)
在C中,两个变量总是有不同的地址 唯一的例外是使用union时 考虑下面给出的代码
union x
{
int a;
int b;
}y;
main()
{
y.a=4;
y.b=2+2;
printf("%p\n",&y.a);
printf("%p",&y.b);
}
这里
y.a
和y.b
都指向同一个地址。在C中,两个变量总是有不同的地址
唯一的例外是使用union时
考虑下面给出的代码
union x
{
int a;
int b;
}y;
main()
{
y.a=4;
y.b=2+2;
printf("%p\n",&y.a);
printf("%p",&y.b);
}
这里
y.a
和y.b
都指向同一个地址。为什么&a=&b
?毕竟,你是在处理变量。也许如果你使用优化,但毕竟这两个变量都表示可用的内存空间,它们彼此完全独立。&a
是a
的地址。它们的值相同,但内存地址不同;C/C++没有t@AswinMurugesh:“这是因为数字常量中id的结果是实现定义的。”您是否阅读了另一个问题的答案?而且,它们是完全不同的语言。你不会看着你的猫问它“你为什么不吠叫”?为什么要这样做?毕竟,你是在处理变量。也许如果你使用优化,但毕竟这两个变量都表示可用的内存空间,它们彼此完全独立。&a
是a
的地址。它们的值相同,但内存地址不同;C/C++没有t@AswinMurugesh:“这是因为数字常量中id的结果是实现定义的。”您是否阅读了另一个问题的答案?而且,它们是完全不同的语言。你不会看着你的猫问它“你为什么不叫”?