声明变量时会发生什么?

时间:2013-09-05 09:00:32

标签: python c

当我读到有关Python和计算机内存的文章时:

  

变量是一种跟踪存储在计算机中的值的方法   记忆。变量是计算机内存中的命名位置。蟒蛇   将变量保存在与值不同的列表中。变量会   包含一个内存地址,该内存地址包含该值。   然后变量引用该值。 Python会选择内存   地址给你。

Terminology

A value has a memory address.
A variable contains a memory address.
A variable refers to a value.
A variable points to a value.
Example: Value 8.5 has memory address id34.
Variable shoe_size contains memory address id34.
The value of shoe_size is 8.5.
shoe_size refers to value 8.5.
shoe_size points to value 8.5.

我的第一个问题是:这是否意味着当我创建一个变量x时,会为其值保留一个内存位置,并为其内存地址保留另一个内存位置?!

我的第二个问题是:此规则是否适用于C编程语言?!

4 个答案:

答案 0 :(得分:2)

  

例如,当我创建变量x时,将为其值保留一个内存位置

  

并为其内存地址保留另一个内存位置?!

Python内部几乎肯定会这样做,虽然因为这是一个实现问题,所以它是无编程的 - 你不直接访问它。这将我们带到:

  

此规则是否适用于C编程语言?!

在C中,我们将这称为指针和变量之间的关系:

int x;
int *p = &x;

这里有一个存储位置存储'x'中的值,另一个位置存储'p'中的值。但是,p 中的值是x 中值的地址。

Python在C中实现并使用动态类型,因此所有变量都是涉及指针和普通值的更复杂的对象(“引擎盖下”),但同样,因为你不能在python中以编程方式访问它,所以它不是很有意义的。地址在C代码中直接访问和操作,但不在python代码中(但它们在C代码中实现python)。

答案 1 :(得分:1)

Python中的变量是“参考”,因为它们本身不是值,但引用到值。值本身是不可变的,并单独存储。如果你“赋值”一个变量,实际上发生的是查找值(可能已创建),并将该值的引用赋给变量。

如果你要在C中处理类似的变量,你会经常使用指针。例如,为其分配不同值的“整数变量x”将如下所示:

int * make_int(int val)
{
    int * p = malloc(sizeof(int));
    *p = val;
    return p;
}

int * x = make_int(5);      // Python: x = 5   # x is a new variable

x = make_int(7);            //         x = 7

x = make_int(11);           //         x = 11

不同之处在于上面的C代码在每一步都会泄漏内存,而在Python中,内存会以某种方式进行管理,例如,如果请求的值已经有匹配的分配,那么你只需要指向它而不是创建一个新对象。换句话说,只有一个,独特的“5”。

答案 2 :(得分:0)

如果你熟悉C,大多数“现代”语言中的变量都非常接近C中的指针。

x = 20

在python中,x指的是一个包含值为20的int(?)对象的内存位置。

在C ++中,这将是

 int *x = new int(20);

这是使用python时需要了解的内容。如何存储内存位置,即x变量本身的内容,我不确定..在C / C ++中它们存储在当前作用域的堆栈帧中,在python中显然它们存储在字典中。(来源:托马斯回答)

答案 3 :(得分:0)

在python中,所有变量都存储在字典中,所以也许这就是你从中获得混淆的地方