python面试-理论面试题
变量通过变量指针,引用对象变量指针指向具体对象的内存空间,取对象的值。 1. 对象,类型已知,每个对象都包含一个头部信息(头部信息:类型标识符和引用计数器) #注意:变量名没有类型,类型属于对象(因为变量引用对象,所以类型随对象),变量引用什么类型的对象,变量就是什么类型的。 2. 在Python中,每个对象都有指向该对象的引用总数---引用计数。可以使用sys.getrefcount()查看该数值。 #注意: 当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。 3. 当我们销毁一个变量时,该变量指向的对象的引用次数将减少一次。 4. 当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾。
2.
is 用于判断两个变量,引用对象是否为同一个地址 == 用于判断引用变量的,值是否相等。 #结论: a.==比较的是内容,is比较的是地址 b.两个变量的地址相同,则两个变量的内容一定相同的 两个变量的内容相同,则地址不一定相同。
3.简述深拷贝和浅拷贝的区别
浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;
深拷贝是拷贝多层,每一级别的数据都会拷贝出来
4.在 Python 中,如何使用socket
模块来进行网络编程?
创建套接字:使用socket.socket()函数创建一个套接字对象。
绑定地址:使用socket.bind()函数将套接字绑定到一个特定的地址和端口。
监听连接:使用socket.listen()函数开始监听连接请求。
接受连接:使用socket.accept()函数接受客户端的连接请求,并返回一个新的套接字对象用于与客户端通信。
发送和接收数据:使用套接字对象的send()和recv()方法来发送和接收数据。
关闭套接字:使用socket.close()函数关闭套接字。
5.如何使用__slots__来限制对象的属性
class MyClass: __slots__ = ('attr1', 'attr2') obj = MyClass() obj.attr1 = 10 obj.attr2 = 20 # 尝试添加不在 __slots__ 中的属性会引发错误 # obj.attr3 = 30
6.如何使用@property
装饰器来实现属性的访问控制?
class MyClass: def __init__(self): self._value = 0 @property def value(self): return self._value @value.setter def value(self, new_value): if new_value >= 0: self._value = new_value else: raise ValueError("Value must be non-negative") obj = MyClass() print(obj.value) obj.value = 5 print(obj.value) # 尝试设置负数值会引发 ValueError # obj.value = -1
7.在 Python 中,如何使用装饰器来实现函数的缓存?
from functools import lru_cache @lru_cache(maxsize=None) def my_function(n): # 这里是函数的具体逻辑 return n ** 2 print(my_function(5)) print(my_function(5))
8.如何使用json
模块来进行 JSON 数据的编码和解码?
import json # 编码 JSON 数据 data = {"name": "Alice", "age": 25} json_data = json.dumps(data) print(json_data) # 解码 JSON 数据 loaded_data = json.loads(json_data) print(loaded_data)