深浅copy
对于不可变类型,深拷贝和浅拷贝的效果是一样的。
对于可变类型,深拷贝和浅拷贝是有区别的。
浅拷贝:两者的值是相同的,在内存中重新申请了一块空间来存放新变量,所以两者的内存地址是不一样的
list1 = [1, 2, 3] list2 = list(list1) print(list2) print("list1==list2 ?",list1==list2) print("list1 is list2 ?",list1 is list2) # 结果 [1, 2, 3] list1==list2 ? True list1 is list2 ? False
列表还可以通过切片操作符来完成
list1 = [1, 2, 3] list2 = list1[:] print(list2) print("list1 == list2 ?",list1 == list2) print("list1 is list2 ?",list1 is list2)
使用copy.copy()
list1 = [1, 2, 3] list2 = copy.copy(list1) print(list2) print("list1 == list2 ?",list1 == list2) print("list1 is list2 ?",list1 is list2)
对于元组,使用 tuple() 或者切片操作符 ‘:’ 不会创建一份浅拷贝,相反它会返回一个指向相同元组的引用(内存地址)。因为其不会创建一份浅copy,因为其新开辟的内存存储是原对象的子对象的引子,而没有创建新的对象来存储原对象子对象的引子,所以不是浅copy
str1 = 'operation' str2 = str1[:] print(str2) print("str1 == str2 ?",str1 == str2) print("str1 is str2 ?",str1 is str2) operation str1 == str2 ? True str1 is str2 ? True
是完全重新copy,分为两个完全不同的个体。
浅copy会出现的问题:
虽然拷贝前后地址不同,但是他们共享了部分内存,就如下,列表中的列表就是共享的内存,所以在往列表中的列表添加数据时,拷贝前后的数据则一样。因为浅copy只是复制了一层。
而深copy则是数值与内存都复制了。
import copy a = [1, [2, 3]] b = copy.deepcopy(a) c = copy.copy(a) a[1].append(4) print(f"原始列表a:{a}") # [1, [2, 3, 4]] print(f"深拷贝出来的列表b:{b}") # [1, [2, 3]] print(f"浅拷贝出来的列表c:{c}") # [1, [2, 3, 4]]
第三方模块的下载与安装
内置的模块不能满足我们的需求,所以,大多数的时候都需要借助于第三方模块
下载第三方模块需要使用pip工具:
pip install 模块名 # 不跟版本号,默认装的是最新版本
pip install django
pip install 模块名==版本号
pip install django == 1.1
pip install openpyxl==2.1.4
pip list
另一个方式可以用pycharm安装
换源:
把下载的路径切换到国内
"""
豆瓣:http://pypi.douban.com/simple/
阿里云:http://mirrors.aliyun.com/pypi/simple/
华为云:https://repo.huaweicloud.com/repository/pypi/simple
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
中科大:https://pypi.mirrors.ustc.edu.cn/simple/
"""
如何换源
方式1:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple # 临时换源
永久换源
# 你自己搜索windows下如何永久换源
方式2:
pycharm中换源