Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python和c语言中的内存分配_Python_C - Fatal编程技术网

python和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的

我在看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的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的结果是实现定义的。”您是否阅读了另一个问题的答案?而且,它们是完全不同的语言。你不会看着你的猫问它“你为什么不叫”?