python共享引用

《 Learning python》 chap6 变量、对象和引用

20191208

变量类型:
变量永远不会有任何的和它先关联的类型信息或约束。类型的概念是存在于对象中而不是变量名中。
变量原本的通用的,它只是在一个特定的时间点,简单地引用了一个特定的对象而已。

变量使用:
当变量出现在表达式中时,它会马上被当前引用的对象所替代,无论这个对象时什么类型。此外,所有的变量必须在其使用前明确地赋值,使用未赋值的变量会发生错误。

–变量在赋值的时候才创建,它可以因引用任何类型的对象,并且必须在引用之前赋值。

例如:a = 3
python在概念上会执三个不同的步骤去完成这个请求。
1)创建一个对象来代表值3
2)创建一个变量a,如果它还没有创建的话;
3)将变量与新的对象3相连接。

在这里插入图片描述

变量名a变成对象3的一个引用,在内部,变量事实上是到对象内存空间的一个指针。

1)变量是一个系统表的元素,拥有指向对象的连接的空间;
2)对象是分配的一块内存,有足够的空间去表示他们所代表的值。
3)引用是自动形成的从变量到对象的指针。

从技术上讲:
每一个对象都有两个标准的头部信息:一个类型标识符去标识这个对象的类型,以及一个引用的计数器,用来决定是不是可以回收这个对象。

类型属于对象,而不属于变量

垃圾收集

在python中,每当一个变量名被赋予了一个新的对象,之前的那个对象占用的空间就会被回收(如果它没有被其它的变量名或对象所引用的话)。这种自动回收对象空间的技术叫做垃圾收集。(主要基于引用计数器)

共享引用

# 共享引用
a = 3
b = a   # 将b也称为对象3 的引用
a = 'spam'
print(a)
print(b)

c = 3
d = c
c = c +2
print(c)
print(d)

# 共享引用和在原处修改
# 两个变量引用了相同的对象
l1 = [2,3,4]
l2 = l1     # 创建引用
l1[0] = 24 # 改变了引用对象
print("l1 = " ,end ='')
print(l1)
print("l2 = ",end = '')
print(l2)

# 两个变量指向了不同的对象,即不同的内存区域
l3 = [2,3,4]
l4 = l3[:]  # 拷贝对象,而不是创建引用
l3[0] = 5
print("l3 = ",end = '')
print(l3)
print("l4 = ",end = '')
print(l4)


# 共享引用和相等
L = [1,2,3]
M = L
print(L == M)   # same value :检查被引用的对象是否有相同的值
print(L is M)   # same object :检查连个变量名是否指向同一个对象(更严格)

L1 = [1,2,3]
M1 = [1,2,3]
print(L1 == M1)
print(L1 is M1)

X = 56
Y = 56
print(X == Y)
# 理论上,x,y应该是== ,但不是is ,
# 不过因为小的整数和字符串被缓存并复用了,所is的结果是true
print(X is Y)

运行结果:

spam
3
5
3
l1 = [24, 3, 4]
l2 = [24, 3, 4]
l3 = [5, 3, 4]
l4 = [2, 3, 4]
True
True
True
False
True
True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值