python面试题整理

1. python语句中pass的作用

pass在python语句中作用为占位符,相当于一段伪代码,并不会执行任何操作。
pass后的语句仍会被执行。


2. copy和deepcopy的区别

想要理解copy和deepcopy,应该清楚python中给变量赋值的原理。
python中数据类型分为可变数据类型和不可变数据类型,常见的不可变数据类型为:str、int、tuple等,可变数据类型有:list、dict等
在python对不可变数据类型的赋值是对该数据内存的地址的引用。

a = 1
b = 1
id(a) = id(b)   

在python中对可变数据的赋值,是重新开辟一个新的内存地址

a = [1,2,3]
b = [1,2,3]
id(a) = 4394704776
id(b) = 4394818824

对于不可变类型的复制,因为不可变类型的值只有一个层级,所以不涉及浅拷贝和深拷贝。
对于可变类型的复制,当可变数据中有不止一个层级,当执行浅拷贝时,可变数据类型中的第二个层级只会复制其指向的内存地址给新的拷贝生成对象。

浅拷贝的几种方法

#1. 切片复制
a = [1,[2,3],4]
b = a[:]

#2. copy方法复制
a = [1,2,3]
b = a.copy()

#3. 列表(字典)生成式
a = [1,2,3]
b = [i for i in a]

浅拷贝只会复制可迭代对象的第一层的数据

a = [1,[2,3],4]
b = a[:]
#b --> [1,[2,3],4]
a[1][0] = 9
#a --> [1,[9,3],4]
#id(a[1]) -->4394813640
#b --> [1,[9,3],4]
#id(b[1]) -->4394813640
'''
改变a中第二层数据的值,因为a、b公用第二层数据的内存地址,
新拷贝对象b中的第二层数据也随之改变
'''

对于可变数据类型中存在多层数据的情况。在浅拷贝时,只能拿到第二层或更深层数据的内存地址,导致原对象的值和新对象的深层数据同时指向一个内存地址,影响新复制生成对象的第二层或者更深层的数据,因此引入 深拷贝 。深拷贝在对第二层或者深层数据进行复制时,是重新开辟内存空间创建对象,储存一个新的内存地址,不会受到原对象中的数据改变干扰
深拷贝方法

import copy
a = [1,[2,3],4]
b = copy.deepcopy(a)
#b -->[1,[2,3],4]
'''此时b中第二层数据[2,3]内存地址和a不同'''
#id(a[1])  --> 4394813640
#id(b[1])  --> 4394895496
a[1][0] = 9
#a ---> [1,[9,3],4]
#b ---> [1,[2,3],4]

3.排序

冒泡排序

num_list = [3,1,2,56,23,32,33,50,234]
l = len(num_list)
for i in range(1,l):
    for j in range(0,l-i):
        if num_list[j]>num_list[j+1]:
            num_list[j],num_list[j+1]=num_list[j+1],num_list[j]


猜你喜欢

转载自blog.csdn.net/weixin_35993084/article/details/80578654