gpt4 book ai didi

python - 什么是 Python 中的对象引用?

转载 作者:太空狗 更新时间:2023-10-30 01:13:23 25 4
gpt4 key购买 nike

一本介绍性的 Python 教科书对“对象引用”的定义如下,但我没看懂:

An object reference is nothing more than a concrete representation of the object’s identity (the memory address where the object is stored).

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

根据我收集的 Wikipediaa = 1234 的(对象)引用将是 a1234 之间的关联,a 是“指向”到 1234(请随意澄清“引用与指针”),但验证起来有点困难,因为 (1) 我正在自学 Python,(2) 许多搜索结果谈论对 Java 的引用,并且 (3) 没有多少搜索结果是关于对象 引用的。

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

最佳答案

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

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

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

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

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

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

我在这里强调这一点,因为它是每种编程语言的基础。那个 12000 就是这个字符串的“地址”。它也是对其位置的“引用”。对于大多数意图和目的,地址 是一个指针,是一个引用。不同的语言对这些有不同的句法处理,但本质上它们是同一件事 - 处理给定数量的数据 block 。

Python 和 Java 尝试尽可能地隐藏此寻址,而像 C 这样的语言很乐意公开指针的确切含义。

由此得出的结论是,对象引用 是数据在内存中存储位置的编号。 (作为一个指针。)

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

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

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

变量ab 不共享存储它们值的内存。但是对于复杂类型:

>>> 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 指定为 s,但显然在这种情况下 t s - 它们共享相同的内存。等等,什么!在这里我们发现 st 都是对同一对象的引用 - 它们只是共享(指向)相同的地址内存。

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

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

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

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

但是如果更改了简单类型或将其传递给函数,则会将其复制到函数中,因此在原始类型中看不到更改。

例如:

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

但是:

def fnB( number ):
number += 1

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

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

关于python - 什么是 Python 中的对象引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35488769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com