1.变量与值在内存中的关系
变量通过变量指针,引用对象变量指针指向具体对象的内存空间,取对象的值。
1. 对象,类型已知,每个对象都包含一个头部信息(头部信息:类型标识符和引用计数器)
#注意:变量名没有类型,类型属于对象(因为变量引用对象,所以类型随对象),变量引用什么类型的对象,变量就是什么类型的。
2. 在Python中,每个对象都有指向该对象的引用总数---引用计数。可以使用sys.getrefcount()查看该数值。
#注意: 当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。
3. 当我们销毁一个变量时,该变量指向的对象的引用次数将减少一次。
4. 当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾。
2.is 与 == 区别
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)