1. 赋值

在Python中,赋值其实就是对象的引用。

a = 9999
b = a
print(a)   #ouput:9999
print(b)   #ouput:9999
print(id(a))  #ouput:1869259054928
print(id(b))  #ouput:1869259054928


这样赋值后,b和a不仅在值上相等,而且是同一个对象,也就是说在堆内存中只有一个数据对象9999,这两个变量都指向这一个数据对象。从数据对象的角度上看,这个数据对象有两个引用,只有这两个引用都没了的时候,堆内存中的数据对象9999才会等待垃圾回收器回收。

需要注意的是,它和下面的赋值过程是不等价的:

a = 9999
b = 9999
print(id(a))  #ouput:1869266158672
print(id(b))  #ouput:1869266158768


虽然a和b的值相等,但他们不是同一个对象,这时候在堆内存中有两个数据对象,只不过这两个数据对象的值相等。

不可变对象

对于不可变对象,修改变量的值意味着在内存中要新创建一个数据对象

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:725638078
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> a = 9999
>>> b = a
>>> id(a)
2625562451792
>>> id(b)
2625562451792
>>> a = 20000
>>> id(a)
2625564836944
>>> id(b)
2625562451792


在a重新赋值之前,b和a都指向堆内存中的同一个数据对象9999,但a重新赋值后,因为数值类型9999是不可变对象,不能在原始内存块中直接修改数据,所以会新创建一个数据对象保存20000,最后a将指向这个20000对象。这时候b仍然指向9999,而a则指向20000。

可变对象

对于可变对象,比如列表,它是在"原处修改"数据对象的。比如修改列表中的某个元素,列表的地址不会变,还是原来的那个内存对象,所以称之为"原处修改"。

例如:

>>> L1 = [1,2,3]
>>> L2 = L1
>>> L1[0] = 999
>>> L1,L2
([999, 2, 3], [999, 2, 3])
>>> id(L1)
2625562620872
>>> id(L2)
2625562620872


在L1[0]赋值的前后,数据对象[1,2,3]的地址一直都没有改变,但是这个列表的第二个元素的值已经改变了。因为L1和L2都指向这个列表,所以L1修改第一个元素后,L2的值也相应地到影响。也就是说,L1和L2仍然是同一个列表对象。

面试中会可能遇到的问题:

1.为啥一直在用9999这个数?

答: