《 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