python对象是什么_Python中的对象引用是什么?

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

假设我们有一个37字节的序列,人类可能会将其解释为一些单词:"The Owl and the Pussy-cat went to sea"

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

^{pr2}$

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

我在这里反复强调这一点,因为它是每种编程语言的基础。12000是这个字符串的“地址”。这也是它的位置的“参考”。在大多数情况下,address是pointer是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和{}不共享存储其值的内存。但对于复杂的类型:>>> 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,但显然在本例中{}是s-它们共享相同的内存。等等,什么!这里我们发现s和t都是对同一对象的引用,它们只是在内存中共享(指向)相同的地址。在

Python与其他语言的一个不同之处在于它将字符串视为一个简单的类型,这些字符串是独立的,因此它们的行为类似于数字:>>> j = 'Pussycat'

>>> k = j

>>> k

'Pussycat'

>>> k = 'Owl'

>>> j

'Pussycat' # < Original has not changed

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

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

但是如果一个简单的类型被改变了,或者传递给了一个函数,它就会被复制到函数中,所以在原始类型中看不到这些变化。在

例如: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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值