python——对象引用、可变性

1. python变量的本质

Python和Java中变量的本质不一样. Java在定义变量的时候, 就已经确定了该变量的数据类型且不可改变. Python的变量实质上是一个指针(或者理解为引用), 指针本身的大小是固定的, 它可以指向一个int, 也可以指向str或其他任何数据类型. 在Python中查找数据, 只需要找到指针即可找到对应的数据. 可以简单把Python变量理解为一个标签, 这个标签的大小是固定的, 标签可以贴在任何对象上

a = 1
a = "abc"

上述代码用python解释就是:将变量a分配给了整型对象1,而不是将整型对象分配给了a。当a重新指向“abc”时,整型对象1会被垃圾回收。

创建对象之后才会把变量分配给对象

2. 标识(引用)、别名、相等性

2.1 标识(id)或者引用

在这里插入图片描述

  • 每个变量都有标识(id),类型,值。对象一旦创建,它的标识就不会改变
  • 标识就是对象在内存中的地址;is运算符用来比较两个对象的标识(地址)
  • 数据的在内存中的地址就是数据的引用,即等价于引用;
  • id()函数用来返回对象的标识的整数表示
a = [1,2,3]
print(id(a)) # 输出a的标识

# result
1481049521736

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 总结:列表、字典、集等保存的是对象的引用(地址),就像第五个例子,列表保存的是L[0],L[]1,L[2],不是整数对象1,2,3。而str、bytes、array.array等单一类型序列是扁平的,保存的不是引用,而是再连续内存中保存的数据本身(对象)

2.2 别名

两个变量指向同一对象,即引用相等,则两个变量互相为别名

a = 1
b = a
# a 与 b互为别名 

2.3 相等性

  • 指的是“==”操作符,判断两个变量所指的对象的值(不是地址)是否相等
  • 存在这样的情况,两个变量所指的对象的值相等,但标识不同,这时因为内存创建了两个对象,两个对象的值相等,但是地址不等
a = [1,2,3]
b = [1,2,3]
print(a==b) # True
print(a is b) # False

2.4 元组的相对不可变性

元组与多数Python集合(列表, 字典, 集,等待)一样,保存的是对象的引用(地址)。如果引用的元素是可变的,即元组本身不可变,元素依然可变。也就是说,元组的不可变性其实是指的是tuple数据结构的物理内容(即保存的引用)不可变,与引用的对象无关。

#示例1
>>> t1 = (1, 2, [30, 40])   #t1不可变,但是t1[-1]可变。
>>> t2 = (1, 2, [30, 40])   #构建元组t2,它的元素与t1一样。
>>> t1 == t2                #虽然t1和t2是不同的对象,但是二者相等——与预期相符。
True
>>> id(t1[-1])              #查看t1[-1]列表的标识。
1631417819656
>>> t1[-1].append(99)       #就地修改t1[-1]列表。
>>> t1
(1, 2, [30, 40, 99])
>>> id(t1[-1])              #t1[-1]的标识没变,只是值变了。
1631417819656
>>> t1 == t2                #现在,t1和t2不相等。
False

猜你喜欢

转载自blog.csdn.net/weixin_44441131/article/details/106933487
今日推荐