python深拷贝和浅拷贝的使用场景 如何面试Python后端工程师?
如何面试Python后端工程师?
1.基于应届毕业生
总的来说,本案例的面试考察的是Python的基本算法和解决项目问题的思路,自己的学习能力,Python的基本内容和标准库。
更倾向于基础知识。
2.根据一点经验
有实际项目经验的调查,对于一些项目经验的细节深入调查,技术主要是数据库、缓存等后端相关生态知识,python的一些高层内容以及第三方库的应用。
百度上有很多题库,你可以根据自己的情况选择。
当然,不管面试是什么。打好基础,实战有项目就差不多了。还是看自己的能力吧!
为什么Python工程师很少像Java工程师那样讨论垃圾回收?
如何管理白记忆中的杜?
Python中主要有三种内存管理机制:引用计数zhi机制、垃圾收集dao机制和内存池机制。
A.引用计数
当一个对象被赋予一个新的名字或被放入一个容器(列表、元组或字典)时,该对象的引用计数将增加。
当del用于表示一个对象被销毁或者引用超过动作或者被重新分配时,该对象的引用计数将会减少。
您可以使用()函数来获取对象的当前引用计数。在大多数情况下,引用计数比我们猜测的要大得多。对于不可变的数据(数字和字符串),解释器会在程序的不同部分共享内存以节省内存。
B.碎片帐集
当对象的引用计数归零时,它将被垃圾收集机制处理掉。
当...的时候
当两个对象A和B相互引用时,del语句可以减少A和B的引用计数,并销毁用于引用底层对象的名称。但是,由于每个对象都包含对其他对象的应用程序,因此引用
计数不会归零,对象也不会被销毁。(导致内存泄漏)。为了解决这个问题,解释器将定期执行循环检测器来搜索不可访问对象的循环并删除它们。
C.内存池机制
Python为内存提供了垃圾收集机制,但是它将未使用的内存放入内存池,而不是返回给操作系统。
1)Pymalloc机制。为了加快Python的执行效率,Python引入了内存池机制来管理小块内存的申请和释放。
2)Python中所有小于256字节的对象都使用pymalloc实现的分配器,而大型对象使用系统的malloc。
3) Python对象,比如整数、浮点数、List,都有自己的私有内存池,对象不共享自己的内存池。也就是说,如果你分配释放了大量的整数,那么用来缓存这些整数的内存就不能再分配给浮点数了。
【Python环境】12个Python面试问题汇总
2.什么是洛杉矶?Mbda函数?它有什么好处?
Lambda表达式通常在你需要一个函数的时候使用,但是你不需要。;t不想费事给它起名字,就是匿名函数。
Lambda函数:主要目的是指出短回调函数。
lambda[参数]:表达式
gtgtgt alambda x,y:x y
gtgtgt a(3,11)
3.如何在Python中实现元组和列表的转换?
直接用tuple和list函数就行了,type()可以确定对象的类型。
4.请编写Python代码来删除列表中的重复元素。
这个地方可以用set来实现。
5.如何在Python中复制一个对象?(赋值、浅拷贝和深拷贝的区别)
赋值()是创建一个对象的新引用,修改任何一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但是它包含了对原对象所包含的项的引用(如果引用修改了一个对象,那么另一个对象也会被修改改变){1、全切片法;2、工厂函数,比如list();3、复制模块的copy()函数}
深层复制:新建一个对象,递归复制它包含的对象(修改一个,另一个不变){()复制模块的函数}
6.介绍except的用法和作用?
尝试…除了…除了…[其他…][最后…]
执行try下的语句,如果抛出异常,执行会跳转到except语句。尝试按顺序执行except中的每个分支,如果抛出的异常与except中的异常组匹配,则执行相应的语句。如果所有异常都不匹配,异常将被传递给调用此代码的下一个最高级别的try代码。
如果try下的语句正常执行,则执行else块代码。如果出现异常,将不会执行。
如果finally语句存在,它最终将总是被执行。
【Python环境】12个Python面试问题汇总
7.什么?;Python中match()和search()的区别是什么?
re模块中的Match(pattern,string [,flags]),并检查字符串的开头是否与模式匹配。
在re模块中,research(pattern,string [,flags])在string中搜索模式的第一个匹配值。
gtgtgt print((;超级;,;迷信;)。span())
(0, 5)
gtgtgt打印((;超级;,;不可逾越;))
没有人
gtgtgt print((;超级;,;迷信;)。span())
(0, 5)
gtgtgt print((;超级;,;无法超越;)。span())
(2, 7)
8.用Python匹配HTML标签时,lt.*gt和lt.*?什么?;gt的区别是什么?
这些术语称为贪婪匹配(lt.*gt)和非贪婪匹配(lt.*?gt)
例如:
试验
lt.*gt:
试验
lt.*?gt:
9.以下代码的输出会是什么?说出你的答案并解释。
输出:
让你不解或惊讶的是,最后一行的输出是3 ^ 2 ^ 3而不是3 ^ 2 ^ 1。为什么改变Parent.x的值会改变Child2.x的值,但同时Child1.x的值不变?
这
这个答案的关键是在Python中
类变量在内部被视为字典。如果在当前类的字典中没有找到变量名,将搜索祖先类(如父类),直到找到被引用的变量名(如果被引用的变量名
变量名在其自己的类或其祖先类中找不到,这将引发AttributeError异常)。
因此,在父类中设置x 1将使对该类及其任何子类的引用中的类变量x 1的值。这是因为第一个print语句的输出是1 1 1。
随后,如果它的任何子类重写了该值(例如,我们执行语句Child1.x 2),那么该值只在子类中发生变化。这就是为什么第二个print语句的输出是1 2 1。
最后,如果父类中的值发生变化(例如,我们执行语句Parent.x 3),这种变化将影响任何没有覆盖该值的子类中的值(在本例中,受影响的子类是Child2)。这就是为什么第三次打印输出是3 2 3。
10.下面的代码会输出什么?
回答
上述代码将输出[],并且不会导致IndexError。
不出所料,试图访问超过列表索引值的成员会导致IndexError(比如访问上面列表的list[10])。但是,试图访问起始索引超过列表成员数的列表片段不会导致IndexError,只会返回空列表。
【Python环境】12个Python面试问题总结
一个恼人的小问题是,它会导致错误,而且这个问题很难跟踪,因为它不会在运行时导致错误。
11.以下代码的输出会是什么?说出你的答案并解释?
如何修改extendList的定义来产生期望的结果?
上述代码的输出是:
很多人误以为list1应该等于[10],list3应该等于[a]。相信每次调用extendList时,list的参数将被设置为其默认值[]。
然而,实际发生的情况是,新的默认列表只在定义函数时创建一次。然后,当指定的List参数没有调用extendList时,它使用同一个列表。这就是为什么在定义函数时,表达式是用默认参数计算的,而不是在调用它时。
因此,list1和list3是相同的操作列表。而` ` ` `` list2是由操作创建的独立列表(通过传递它自己的空列表作为list ` ```` `参数的值)。
extendList函数的定义可以修改如下,但是当没有指定新的List参数时,总是会开始一个新的list,这更可能是预期的行为。
12.下面的程序输出什么?
好的
好了,第一行代码是我第一次看到。第一行输出[[],[],[],[],一个包含五个空列表的列表,而第二行输出[[10]。
[10], [10], [10],
[10]],我只能解释这五个列表指向同一个列表,所以修改其他四个中的任何一个都会改变。您可以尝试断开与列表[0]10的连接。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。