标签:属性 init 更改 load ref als pen with open self
深复制,浅复制就类似与C语言中的值传递还是址传递
id
值在CPython
解释器里就代表它在内存中的`地址# Python中一个list类型的数据,如果直接使用 = 去复制,他们的id会相同 # 其中一个值改变,另一个值相应改变 import copy a = [1,2,3] b = a b[1]=22 print(a) print(id(a) == id(b))
当使用浅拷贝时,python
只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。
# 当使用浅复制时,二者id是不同的(但这只限于外围对象) >>> import copy >>> a=[1,2,3] >>> c=copy.copy(a) #拷贝了a的外围对象本身, >>> id(c) 4383658568 >>> print(id(a)==id(c)) #id 改变 为false False >>> c[1]=22222 #此时,我去改变c的第二个值时,a不会被改变。 >>> print(a,c) [1, 2, 3] [1, 22222, 3] #a值不变,c的第二个值变了,这就是copy和‘==’的不同
# 当a具有内部对象时,使用浅复制,内部对象的id还是相同的,一个变随着变 >>> a=[1,2,[3,4]] #第三个值为列表[3,4],即内部元素 >>> d=copy.copy(a) #浅拷贝a中的[3,4]内部元素的引用,非内部元素对象的本身 >>> id(a)==id(d) False >>> id(a[2])==id(d[2]) True >>> a[2][0]=3333 #改变a中内部原属列表中的第一个值 >>> d #这时d中的列表元素也会被改变 [1, 2, [3333, 4]]
deepcopy
对外围和内部元素都进行了拷贝对象本身,而不是对象的引用。
# 当使用深复制,两个对象完全没有关系 >>> a=[1,2,[3,4]] #第三个值为列表[3,4],即内部元素 >>> e=copy.deepcopy(a) #e为深拷贝了a >>> a[2][0]=333 #改变a中内部元素列表第一个的值 >>> e [1, 2, [3, 4]] #因为时深拷贝,这时e中内部元素[]列表的值不会因为a中的值改变而改变
爬虫使用分布式爬虫时,如果层次太多,最好使用深复制,不然可能会出现数据覆盖
class Student: name = "abc" age = 18 sex = 1 def __init__(self, name, age, sex=0): self.name = name self.age = age self.sex = sex def print(self): print(self.name) print(self.age) print(self.sex) stu = Student("T", 22) stu.print() stu = Student("R", 18, 1) stu.print() stu.sex = 0 # 属性可以更改 print(stu.sex)
pickle 是一个 python 中, 压缩/保存/提取 文件的模块. 最一般的使用方式非常简单. 比如下面就是压缩并保存一个字典的方式. 字典和列表都是能被保存的.
# 保存数据 pickle.dump(dict, file) # 提取数据 pickle.load(file)
import pickle dict = [{"a": 1, "b":2}, {"c": 3, "d": 4}] file = open("dict.pickle", "wb") pickle.dump(dict, file) file.close() # file = open("dict.pickle", "rb") # dict2 = pickle.load(file) # file.close() with open("dict.pickle", "rb") as file: dict2 = pickle.load(file) print(dict2)
参考链接:
标签:属性 init 更改 load ref als pen with open self
原文地址:https://www.cnblogs.com/tanrong/p/10049773.html