面试题
Python的内置类型中可变类型和不可变类型都有哪些?解析
这一题目考察两个点,一个是python的内置类型,一个是可变/不可变类型的概念,对python基本功扎实的同学来说是比较简单的。
首先是python的内置类型,可以列举一些常用的像字符串(str),数字(int, float),布尔值(boolean),列表(list),字典(dict)等等,这个只要是用过python的基本都会。
接下来是可变/不可变类型的含义。个人理解,可变类型和不可变类型的差别在于修改变量时是否还在原来的内存空间中进行修改,还是说需要申请新的空间然后将修改后的变量。下面以整型和列表为例分别展示一下不可变模型和可变模型。
不可变类型
def immutable_variables():
# int
i = 0
ii = i
print("i == ii: {}".format(i == ii)) # True
print("i is ii: {}".format(i is ii)) # True
i += 1
print("i == ii: {}".format(i == ii)) # False
print("i is ii: {}".format(i is ii)) # False
print(i, ii) # 1 0
可变类型
def mutable_variables():
# list
l = [1]
ll = l
print("l == ll: {}".format(l == ll)) # True
print("l is ll: {}".format(l is ll)) # True
l.append(2)
print("l == ll: {}".format(l == ll)) # True
print("l is ll: {}".format(l is ll)) # True
print(l ll) # [1, 2] [1, 2]
从上面代码输出可以看到,对于不可变类型int,它自增的过程其实是将值计算之后重新申请一个内存空间,然后i变量指向新的内存空间,所以i和ii的值不一样了,指向的也不是同一个对象;对于可变类型list,它添加元素时候是直接在原来变量l指向的空间中进行添加,所以l不需要指向新的内存空间,因此造成的结果是ll也跟着变了,因此它们有相同的值且指向相同的对象。这就是可变/不可变类型的含义和影响。答案
python内置类型中不可变类型有str, int, float, boolean, tuple;可变类型有list, dict, set。拓展
关于这个问题在日常的应用中,一般是要小心把可变对象作为函数参数的情况,因为这样可能会使得在函数中修改参数时外部变量跟着被修改,如同上面代码修改l时ll也跟着修改的情况。
一起学习进步,欢迎关注点赞,一键三连~
更多python面试题,可关注公众号“进击的程序人”获取~