Python 中的变量不是装有对象的“容器”,而是贴在对象上的“标签”。
真正的存贮位置是内存中
每个对象在内存中都会存储三个数据:
1.id(标识)
2.type(类型)
3.value(值)
而可变对象即指在对象不改变的前提下让对象的数据发生改变
即值发生改变但是 对象 未发生改变,例如 标识id 不会发生改变
a = [1,2,3]
print('修改前',a,id(a))
a[0] = 4 #改变了值
print('修改后',a,id(a)) #但是id未变
修改前 [1, 2, 3] 1221617771648
修改后 [4, 2, 3] 1221617771648
a = [1,2,3]
print('修改前',a,id(a))
a = [2,3,4] #重新赋值即重新建立一个a,所以这个a不是原来的a,
#而是新生的a
print('修改后',a,id(a)) #所以内存中重新开辟空间,对象发生改变
修改前 [1, 2, 3] 2057897038528
修改后 [2, 3, 4] 2057897038720
因为对象不可变,所以为了提高效率,Python 会使用一些公用的对象:
a = 1
print('a', id(a))
b = 1
print('b', id(b))
print(a == b)
print(a is b)
c = 'hello world'
print('c', id(c))
d = 'hello world'
print('d', id(d))
print(c == d)
print(c is d)
输出:
a 4423761776
b 4423761776
True
True
c 4430180912
d 4430180912
True
True
这里顺便提一下 is 这个操作符。它和 == 的区别在于:== 只判断“值”是不是相等,而 is 则判断是否为同一个对象,也就是地址一致。比如:
a = 2
b = 2.0
print(a == b)
print(a is b)
输出:
True
False
不可变对象不允许对自身内容进行修改。如果我们对一个不可变对象进行赋值,实际上是生成一个新对象,再让变量指向这个对象。:
即重新赋值
a = 0
print('a', id(a))
a = 1
print('a', id(a))
输出:
a 4463151440
a 4463151472