Python 中的对象引用是什么?

2023-11-23

一本Python入门教科书对“对象引用”的定义如下,但我不明白:

对象引用只不过是对象身份(存储对象的内存地址)的具体表示。

教科书尝试通过使用箭头将对象引用显示为来自变量的某种关系来说明这一点a到一个物体1234在赋值语句中a = 1234.

从我收集到的维基百科,(对象)引用a = 1234将是之间的关联a and 1234 were a是“指向”1234(随意澄清“引用与指针”),但验证起来有点困难,因为(1)我正在自学 Python,(2)许多搜索结果都谈到了引用Java,并且 (3) 相关搜索结果并不多object参考。

那么,Python 中的对象引用是什么?谢谢您的帮助!


与变量名相关的任何内容都必须存储在程序内存中的某个位置。想到这一点的一个简单方法是,内存的每个字节都有一个索引号。为了简单起见,让我们想象一台简单的计算机,这些索引号从 0(第一个字节)向上到有多少个字节。

假设我们有一个 37 个字节的序列,人类可能会将其解释为一些单词:

"The Owl and the Pussy-cat went to sea"

计算机将它们存储在一个连续的块中,从内存中的某个索引位置开始。该索引位置通常称为“地址”。显然这个地址绝对只是一个数字,这些字母所在的内存的字节数。

@12000 The Owl and the Pussy-cat went to sea

所以在地址 12000 处是T,在 12001h, 12002 一个e...直到最后a于 12037。

我在这里强调这一点是因为它是每种编程语言的基础。 12000 就是这个字符串的“地址”。它也是对其位置的“参考”。对于大多数意图和目的address is a pointer is a reference。不同的语言对这些有不同的语法处理,但本质上它们是相同的——处理给定数量的数据块。

Python 和 Java 试图隐藏这一点寻址尽可能多地,其中语言喜欢C非常乐意揭露指针的本来面目。

由此得出的结论是object reference是数据在内存中存储的位置的编号。 (正如一个pointer.)

现在,大多数编程语言都区分简单类型(字符和数字)和复杂类型(字符串、列表和其他复合类型)。这就是对对象的引用产生影响的地方。

所以在对简单类型进行操作时,它们是独立的,它们各自有自己的内存进行存储。想象一下 python 中的以下序列:

>>> a = 3
>>> b = a
>>> b
3
>>> b = 4
>>> b
4
>>> a
3      # <-- original has not changed

变量a and b不要共享存储其值的内存。但对于复杂类型:

>>> s = [ 1, 2, 3 ]
>>> t = s
>>> t
[1, 2, 3]
>>> t[1] = 8
>>> t
[1, 8, 3]
>>> s
[1, 8, 3]  # <-- original HAS changed

我们分配了t to be s,但显然在这种情况下t is s- 他们共享相同的记忆。等等,什么!在这里我们发现两者s and t are a 参考指向同一个对象 - 它们只是共享(指向)内存中的相同地址。

Python 与其他语言的不同之处在于,它将字符串视为一种简单类型,并且它们是独立的,因此它们的行为类似于数字:

>>> j = 'Pussycat'
>>> k = j
>>> k
'Pussycat'
>>> k = 'Owl'
>>> j
'Pussycat'  # <-- Original has not changed

而在C字符串肯定会作为复杂类型进行处理,并且其行为类似于 Python 列表示例。

所有这一切的结果是,当修改通过引用处理的对象时,对此对象的所有引用都会“看到”更改。因此,如果将对象传递给修改它的函数(即:保存数据的内存内容发生更改),则更改也会反映在该函数之外。

但是,如果更改简单类型或传递给函数,则它是copied函数,因此在原始版本中看不到更改。

例如:

def fnA( my_list ):
    my_list.append( 'A' )

a_list = [ 'B' ]
fnA( a_list )
print( str( a_list ) )
['B', 'A']        # <-- a_list was changed inside the function

But:

def fnB( number ):
    number += 1

x = 3
fnB( x )
print( x )
3                # <-- x was NOT changed inside the function

因此请记住,通过引用使用的“对象”的内存由所有副本共享,而简单类型的内存则不然,很明显这两种类型的操作不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的对象引用是什么? 的相关文章

随机推荐

  • 计算两个日期之间的营业时间

    如何计算两个日期之间的营业时间 例如我们有两个日期 2010年1月1日 15 00 和 2010年1月4日 12 00 我们的工作时间是工作日 09 00 至 17 00 如何用sql计算工作时间 Baran 的答案针对 SQL 2005
  • 将 LINQ to SQL 与 Oracle 结合使用[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我知道 linq to sql 实际上是 LINQ to SQL Server 我还读到 人们可以构建自己的 LINQ 提供程序 以便连接到其他数据库系统 如 oracle 或
  • Perl Parallel::ForkManager 与 DBI 数据库处理程序

    我对并行执行多个数据库操作感兴趣 我已经使用过 Perl Parallel ForkManager 但尚未将其用于任何数据库 我读过数据库连接是没有得到很好的支持有了这个 有人对此有经验吗 作为一个例子 我可能会生成一个系统调用 它执行 D
  • Traefik Dashboard:Ingress 和 IngressRoute,它们可以共存吗?

    最近我正在将一个项目迁移到 Kubernetes 并使用 Traefik 作为入口控制器 对于 Traefik 我使用 Traefik Ku bernetes Ingress 提供程序进行路由 当我尝试添加 Traefik 仪表板时 我发现
  • 多个键范围作为 CouchDB 视图的参数

    根本问题 假设我的文档有 类别 and 时间戳 如果我想要所有文件 foo 时间戳在过去两个小时内的类别 很简单 function doc emit doc category doc timestamp null 然后查询为 GET ser
  • GWT 服务异常日志记录的最佳实践

    我决定将日志系统添加到我的 gwt 服务层 首先 我想记录从该层引发的所有异常 我有一个类似于Spring的ServletDispatcher的对象 它调用其他服务 我以为我可以在那里添加日志记录 但我意识到 GWT 服务将已检查的异常包装
  • CSS边距恐怖;边距在父元素外部添加空间[重复]

    这个问题在这里已经有答案了 我的 CSS 边距没有按照我想要或期望的方式运行 我似乎我的标题 margin top 影响了它周围的 div 标签 This is what I want and expect but this is what
  • 更新 matplotlib 中的行

    我有一个包含多个数据集的图表 随着数据的更新 我需要不断地重新绘制这些线 每条线都是单独的 如何重复删除并重新建立它 最好不必每次都删除整个图表并重新绘制其上的所有线条 usr bin env python import time from
  • 我可以使用 jquery 确定设备处于纵向还是横向模式吗?

    我想有条件地改变用户在我要创建的照片库网站上看到的内容 具体取决于用于查看该网站的设备是否处于纵向 垂直与横向 水平模式 方向 这可能吗 Try the orientationchange事件处理程序 如下所示 window bind or
  • 从 MySQL 中的字段中选择最常见的值

    我有一个包含一百万行的表 如何从字段中选择最常见的 表中出现最多的值 值 您需要按感兴趣的列进行分组 并为每个值选择该值本身及其出现的行数 然后就是排序 将最常见的值放在第一位 并将结果限制为一行的问题 以查询形式 SELECT colum
  • 如何更改 GGally::ggpairs 的调色板?

    这与中的问题相同R 和 ggpairs 中用户定义的调色板 or 有没有办法使用 ggplot 更改 GGally ggpairs 的调色板 只是那里的解决方案不再有效 我也想改变调色板 但是有没有办法使用 ggplot 更改 GGally
  • Python:确定序列中的任何项目是否等于任何其他项目

    我想比较多个对象并返回True仅当所有对象之间不相等时 我尝试使用下面的代码 但它不起作用 如果 obj1 和 obj3 相等且 obj2 和 obj3 不相等 则结果为True obj1 obj2 obj3 我有超过 3 个对象需要比较
  • Centos 6.4 - 无法从共享对象映射段:权限被拒绝

    您好 我正在尝试安装 Phusion Passenger 安装成功 但执行时出现以下错误service httpd start Starting httpd httpd Syntax error on line 221 of etc htt
  • 具有多个参数的 MVC4 Web API Rest 接口

    我有一个名为 LoginController 的控制器 其 Get 方法的签名为 public string Get string Key string Code string UserID string Password 我希望能够通过类
  • Github Actions 有模板吗

    由于我的 Github Actions 中有重复的步骤 我想创建一个模板 让我们举个例子 name ci on push jobs build and test strategy matrix os ubuntu latest runs o
  • 如何多次使用相同的参数?

    我知道关于sprintf 但是如何多次使用相同的参数呢 如果我使用以下代码 则会收到有关使用少量参数的错误 sprintf blabla s 11111 s test 我想更换 s with test twice Use the 编号占位符
  • Javascript 排序“不稳定” - 我该如何解决这个问题?

    根据MDN spec Javascript sort 函数 不稳定 不维护相同元素的输入顺序 讽刺的是 Firefox 目前似乎还没有实现这一点 但 Chrome 似乎实现了 这给我留下了一些问题 我有一组元素要排序 一旦排序 我想将它们标
  • 如何将 3 个 UIButtons 对齐到 UITableCellView 的中心?

    我怎样才能对齐3UIButtons 到 a 的中心UITableCellView 例如说我有 3UIButtons 的标题 Email Phone Skype 其中一项或多项是可能的UIButtons 被隐藏 例如 如果电话UIButton
  • 基于 Zend_Framework 的应用程序示例 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 您知道有哪些基于 Zend
  • Python 中的对象引用是什么?

    一本Python入门教科书对 对象引用 的定义如下 但我不明白 对象引用只不过是对象身份 存储对象的内存地址 的具体表示 教科书尝试通过使用箭头将对象引用显示为来自变量的某种关系来说明这一点a到一个物体1234在赋值语句中a 1234 从我