本周学习
1、深浅拷贝
python的编译器有小数据池这么一说,在创建数据时如果数据较小,数据就会直接指向小数据池,所以如果两个数据集有相同的几个数据,他们可能指向的是同一个地址,我们可以用id()方法来查看数据的内存地址,如下例第一部分,当使用copy()方法浅拷贝一个元组时,再删除原来集合的一个元素,这时打印两个元组,可以发现拷贝后的集合也被删除了同样的一个元素;但是两个元组的地址是不同的;下例第二部分,利用copy()方法浅拷贝的列表,当原本的列表被添加一个元素时,拷贝出来的列表并没有发生变化,说明浅拷贝不拷贝相关的父类及属性;下例第三部分,直接赋值时,当原来的列表被添加一个元素或者原来列表的一个元素发生变化时,赋值后的列表的对应元素也发生了变化,这时打印赋值前后的两个列表,发现两个列表所指向的地址是相同的,说明赋值操作并没有创建新的列表;下例第四部分,当使用deepcopy()深拷贝一个列表,如果原来的列表被添加或删除元素或者原来列表的一个元素发生变化,拷贝后的列表不会发生相应的变化,说明深拷贝拷贝了相关的父类及属性。
import copy
set1 = {1, 5, 7, 5, 8, 45, 45, 5, 8}
list1 = {1, 5, 7, 5, 8, 45, 45, 5, 8}
s = set(list1)
list1 = list(s)
print(list1) #利用集合去重
set1.pop() #随机删除一个
set2 = set1.copy()
print(set1, set2)
print(id(set1), id(set2)) # 浅拷贝
list1 = ["张三丰", ["王一", "王二"], "王思聪", "小昭"]
list2 = list1.copy()
# list1[1].append("仓小狗")
list1.append("张无忌")
print(id(list1))
print(id(list2))
print(list2)
print(list1) # 浅拷贝,不拷贝相关的父类及属性 copy/[:]
list1 = ["张三丰", ["王一", "王二"], "王思聪", "小昭"]
list2 = list1
list1[1].append("仓小狗")
list1.append("张无忌")
print(id(list1))
print(id(list2))
print(list2)
print(list1) # 赋值,同一个内存地址,没有创建新对象 =
list1 = ["张三丰", ["王一", "王二"], "王思聪", "小昭"]
list2 = copy.deepcopy(list1)
list1[1].append("仓小狗")
list1.append("张无忌")
print(id(list1))
print(id(list2))
print(list2)
print(list1) # 深拷贝,拷贝相关的父类及属性
2、国密算法模块
from pyDes import des, CBC, PAD_PKCS5
import binascii
KEY = 'wyncxt' # 秘钥
def des_encrypt(s):
"""
DES 加密
:param s: 原始字符串
:return: 加密后字符串,16进制
"""
secret_key = KEY
iv = secret_key
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
en = k.encrypt(s, padmode=PAD_PKCS5)
return binascii.b2a_hex(en)
def des_decrypt(s):
"""
DES 解密
:param s: 加密后的字符串,16进制
:return: 解密后的字符串
"""
secret_key = KEY
iv = secret_key
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
de = k.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5)
return de
if __name__ == "__main__":
string = input("请输入您要加密的字符串:")
en_crypt = des_encrypt(string)
de_crypt = des_decrypt(en_crypt).decode()
print(en_crypt)
print(type(en_crypt))
print(de_crypt)
print(type(en_crypt))