Python名称中的内容

2024-10-02 18:15:00 发布

您现在位置:Python中文网/ 问答频道 /正文

在web中,python的名称有很多混淆,文档中的名称似乎也不太清楚。下面是我读到的关于python名称的一些信息。在

  1. 名称是对对象的引用(它们在哪里?堆?)名字里有一个地址。(像Java)。

  2. Python中的名称就像C++引用(int和b),这意味着它是内存位置的另一个别名;即对于{{CD1>},^ {< CD2>}是一个内存位置。如果int& b = a表示{}是同一内存位置的另一个名称

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

以上哪个陈述是正确的?在

Python名称中是否包含某种地址,或者只是一个内存位置的名称(如C++ ^ {CD5>}引用)?在

python名称存储在哪里,堆栈还是堆?在

EDIT

appendix+A.+A+Selective+and+Impressionistic+Short+Review+of+Python/A.2+Namespaces+and+Bindings/#" rel="nofollow">http://etutorials.org/Programming/Python.+Text+processing/Appendix+A.+A+Selective+and+Impressionistic+Short+Review+of+Python/A.2+Namespaces+and+Bindings/#查看以下行

当一个对象本身的名字被取消引用的时候。如果名称尚未在某个可访问的范围内绑定,则无法取消对该名称的引用;尝试这样做会引发NameError异常。如果名称后面跟有左括号和右括号(可能中间有逗号分隔的表达式),则在取消引用后调用/调用对象。对于Python对象,调用时发生的事情可以控制和重写;但一般来说,调用函数或方法会运行一些代码,而调用一个类会创建一个实例。例如:

pkg.subpkg.func() # invoke a function from a namespace

x = y # deref 'y' and bind same object to 'x'

这使得理智点想交叉检查一下有多真实吗是。评论请回答


Tags: andof对象内存名称地址bindings名字
3条回答

Python的名字是,嗯,名字。你有对象和名字,就这样。在

创建一个对象,比如[3, 4, 5]在堆的某个处创建一个对象。你不需要知道怎么做。现在,您可以通过将名称指定给名称来将其指定给该对象:

x = [3, 4, 5]

也就是说,赋值运算符指定名称而不是值。x不是[3, 4, 5],不,它只是一个指向[3, 4, 5]对象的名称。所以这样做:

^{pr2}$

不更改原始的[3, 4, 5]对象,而是将对象1指定给名称x。还请注意,大多数表达式,如[3, 4, 5],但{}都创建临时表。除非你给那个临时工指定一个名字,否则它会立即死亡。没有任何机制(例如,在CPython中,对于小数字,除此之外),没有机制来保持未被引用的对象的活动状态,并将其缓存。例如,这将失败:

>>> x = [3, 4, 5]
>>> x is [3, 4, 5] # must be some object, right? no!
False

但是,这仅仅是赋值(这在Python中是不可重载的)。实际上,Python中的对象和名称的行为非常类似于自动取消引用指针,只不过它们会自动被引用计数,并且在不再被引用后会消亡(至少在CPython中),并且它们不会在赋值时自动取消引用。在

由于这种内存模型,例如,重载索引操作的C++方式不起作用。相反,Python使用__setitem____getitem__,因为不能返回任何“可赋值”的内容。此外,运算符+=*=等。。。创建临时文件并将临时文件分配回名称。在

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++引用行为的是

^{pr2}$

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对象是stored on a heap,通过reference counting进行垃圾回收。在

变量是对Java中的对象的引用,因此第1点适用。我不熟悉C中的C++或自动撤销指针变量,以便调用这些变量。在

最终,由python解释器来查找解释器结构中的项,这些解释器结构通常是python列表、字典和其他类似的抽象容器;名称空间使用dict(哈希表),其中名称和值是指向其他python对象的指针。它们由mapping protocol显式管理。在

对于python程序员来说,这一切都是隐藏的;您不需要知道您的对象在哪里,只要您有引用它们的东西,它们仍然是活动的。在用python编写代码时,可以传递这些引用。在

相关问题 更多 >