python - Python 名称中的内容

标签 python

网络上对 python 名称存在很多混淆,文档似乎对名称也不是很清楚。以下是我读到的关于 python 名称的几件事。

  1. 名称是对对象的引用(它们在哪里?堆?)而名称包含的是地址。 (像 Java)。

  2. python 中的名称类似于 C++ 引用 (int& b),这意味着它是内存位置的另一个别名;即对于 int aa 是一个内存位置。如果 int& b = a 表示 b 是同一内存位置的另一个名称

  3. 名称与 C 中的自动解引用指针变量非常相似。

以上哪些说法是正确的?

Python 名称中是否包含某种地址,或者它只是内存位置的名称(如 C++ & 引用)?

python 名称存储在哪里,Stack 还是 heap?

编辑:

查看 http://etutorials.org/Programming/Python.+Text+processing/Appendix+A.+A+Selective+and+Impressionistic+Short+Review+of+Python/A.2+Namespaces+and+Bindings/# 中的以下行

每当一个(可能是合格的)名称出现在赋值的右侧,或者单独出现在一行上时,该名称就会被取消引用到对象本身。如果一个名字没有被绑定(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/

相关文章:

python - 如何在 Python 中进行异步 gRPC 调用?

python - Python 最好的浏览器自动化工具是什么?

python - 在Python中的圆括号或大括号中不存在的逗号上分割字符串

python Nose 和扭曲

python - 函数的时间复杂度

python - 属性错误: 'guiCreate' object has no attribute 'master' - Why can't i access functions from another class?

python - 使用 Python/Django 从 html 获取第一张图片

python - 列表理解头痛

python - 如何在声明后访问 CVXPY 变量/参数

python - 表情符号在上传到 Bigquery 时崩溃