1

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

变量是一种跟踪存储在计算机内存中的值的方法。变量是计算机内存中的一个命名位置。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

4 回答 4

2

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

是的。

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

Python 内部几乎肯定会这样做,尽管这是一个实现问题,它与编程无关——您不能直接访问它。这使我们:

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

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

int x;
int *p = &x;

这里有一个内存位置将值存储在“x”中,另一个位置将值存储在“p”中。但是, p中的值是 x 中值的地址

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

于 2013-09-05T09:11:06.587 回答
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”。

于 2013-09-05T14:55:57.283 回答
0

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

IE

x = 20

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

在 C++ 中,这将是

 int *x = new int(20);

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

于 2013-09-05T09:09:46.553 回答
0

在 python 中,所有变量都存储在字典中,所以也许这就是你感到困惑的地方

于 2013-09-05T09:09:52.910 回答