码迷,mamicode.com
首页 > 编程语言 > 详细

Python 扫盲

时间:2018-12-01 17:03:13      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:属性   init   更改   load   ref   als   pen   with open   self   

深复制 & 浅赋值

深复制,浅复制就类似与C语言中的值传递还是址传递

id : 一个对象的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 类 init 功能

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 保存数据

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)

 

 

 

 

参考链接:

copy & deepcopy 浅复制 & 深复制

 

Python 扫盲

标签:属性   init   更改   load   ref   als   pen   with open   self   

原文地址:https://www.cnblogs.com/tanrong/p/10049773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!