网络上对 python 名称存在很多混淆,文档似乎对名称也不是很清楚。以下是我读到的关于 python 名称的几件事。
名称是对对象的引用(它们在哪里?堆?)而名称包含的是地址。 (像 Java)。
python 中的名称类似于 C++ 引用 (int& b),这意味着它是内存位置的另一个别名;即对于
int a
,a
是一个内存位置。如果int& b = a
表示b
是同一内存位置的另一个名称名称与 C 中的自动解引用指针变量非常相似。
以上哪些说法是正确的?
Python 名称中是否包含某种地址,或者它只是内存位置的名称(如 C++ &
引用)?
python 名称存储在哪里,Stack 还是 heap?
编辑
:
每当一个(可能是合格的)名称出现在赋值的右侧,或者单独出现在一行上时,该名称就会被取消引用到对象本身。如果一个名字没有被绑定(bind)在某个可访问的范围内,它就不能被取消引用;尝试这样做会引发 NameError 异常。如果名称后跟左右括号(它们之间可能有逗号分隔的表达式),则在取消引用后调用/调用该对象。对于 Python 对象,可以控制和覆盖调用时发生的确切情况;但一般来说,调用一个函数或方法会运行一些代码,而调用一个类会创建一个实例。例如:
pkg.subpkg.func() # invoke a function from a namespace
x = y # deref 'y' and bind same object to 'x'
这是有道理的。只是想交叉检查它的真实性。请评论和回答
最佳答案
names are references to objects
是的。如果你只是想了解 Python 变量的语义,你不应该关心对象的位置;它们在内存中的某个地方,Python 实现为您管理内存。他们如何做到这一点取决于实现(CPython、Jython、PyPy...)。
names in python are like C++ references
不完全是。在 C++ 中重新分配引用实际上是重新分配引用的内存位置,例如之后
int i = 0;
int &r = i;
r = 1;
i == 1
为真。除非使用可变容器对象,否则不能在 Python 中执行此操作。最接近 C++ 引用行为的是
i = [0] # single-element list
r = i # r is now another reference to the object referenced by i
r[0] = 1 # sets i[0]
are very similar to automatically dereferenced pointers variables in C
不,因为它们在上述方面类似于 C++ 引用。
Does Python names contain some kind of address in them or is it just a name to a memory location?
前者更接近事实,假设一个简单的实现(同样,PyPy 的做事方式可能与 CPython 不同)。无论如何,Python 变量不是存储位置,而是可能位于内存中任何位置的对象的标签/名称。
Python 进程中的每个对象都有一个身份,可以使用id
函数获得,在CPython 中该函数返回其内存地址。您可以通过检查它们的 id
或更直接地使用 is
来检查两个变量(或更一般的表达式)是否引用同一对象:
>>> i = [1, 2]
>>> j = i # a new reference
>>> i is j # same identity?
True
>>> j = [1, 2] # a new list
>>> i == j # same value?
True
>>> i is j # same identity?
False
关于python - Python 名称中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12329618/