首页 > 代码库 > Python学习——深浅拷贝

Python学习——深浅拷贝

1.对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。 
>>> import copy
# ######### 数字、字符串 #########
>>> n1 = 123
>>> print(id(n1))

# ## 赋值 ##
>>> n2 = n1
>>> print(id(n2))

# ## 浅拷贝 ##
>>> n2 = copy.copy(n1)
>>> print(id(n2))

# ## 深拷贝 ##
>>> n3 = copy.deepcopy(n1)
>>> print(id(n3))

2.对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
赋值:只是创建一个变量,该变量指向原来内存地址
>>> n1 = {"k1": "hu", "k2": 123, "k3": ["hh", 456]}
>>> n2 = n1

浅拷贝:在内存中只额外创建第一层数据但是值得地址不变
>>> import copy
>>> n1 = {"k1": "hu", "k2": 123, "k3": ["hh", 456]}
>>> n2 = copy.copy(n1)
>>> print(id(n1))
5706496
>>> print(id(n2))
6270928

>>> print(id(n1[‘k1‘]))
6204824
>>> print(id(n2[‘k1‘]))
6204824

深拷贝:在内存中将所有的数据重新创建一份
>>> import copy
>>> n1 = {"k1": "hu", "k2": 123, "k3": ["hh", 456]}
>>> n2 = copy.deepcopy(n1)
>>> print(id(n1))
5706496
>>> print(id(n2))
6270808

>>> print(id(n1[‘k1‘]))
6204864
>>> print(id(n2[‘k1‘]))
500261040

例:
字典dic ={‘k1‘:[20,30],‘k2‘:[40,50],‘k3‘:[50,60]},现在需要更新该字典保存在新字典new_dic 中但不改变原字典
>>> dic ={‘k1‘:[20,30],‘k2‘:[40,50],‘k3‘:[50,60]}
浅拷贝:
>>> new_dic = copy.copy(dic)
>>> new_dic[‘k1‘][0] = 100
#浅拷贝改变新字典的同时也改变了原来的字典
>>> print(new_dic)
{‘k1‘:[100,30],‘k2‘:[40,50],‘k3‘:[50,60]}
>>> print(dic)
{‘k1‘:[100,30],‘k2‘:[40,50],‘k3‘:[50,60]}

深拷贝:
>>> new_dic = copy.copy(dic)
>>> new_dic[‘k1‘][0] = 100
#深拷贝只改变新字典
>>> print(new_dic)
{‘k1‘:[100,30],‘k2‘:[40,50],‘k3‘:[50,60]}
>>> print(dic)
{‘k1‘:[20,30],‘k2‘:[40,50],‘k3‘:[50,60]}

python之邮件发送源码:
技术分享
 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 ‘‘‘
 4 # @time    : 2017/4/10 22:58
 5 # @author  : huange
 6 # @version : 1.1
 7 # @file    : mail.py
 8 # @Software: PyCharm
 9 ‘‘‘
10 #coding:utf-8   #强制使用utf-8编码格式
11 import smtplib  #加载smtplib模块
12 from email.mime.text import MIMEText
13 from email.utils import formataddr
14 my_sender=********@163.com #发件人邮箱账号,为了后面易于维护,所以写成了变量
15 #my_user=‘*******@qq.com‘ #收件人邮箱账号,为了后面易于维护,所以写成了变量
16 def mail(my_user):                  #user为形式参数
17     ret=True
18     try:
19         content = ‘‘‘
20         hello world!
21         SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,
22         由它来控制信件的中转方式。
23         ‘‘‘
24         msg=MIMEText(content,plain,utf-8)
25         msg[From]=formataddr(["欢哥",my_sender])   #括号里的对应发件人邮箱昵称、发件人邮箱账号
26         msg[To]=formataddr(["一蓑烟雨",my_user])   #括号里的对应收件人邮箱昵称、收件人邮箱账号
27         msg[Subject]="python邮件测试" #邮件的主题,也可以说是标题
28 
29         server=smtplib.SMTP("smtp.163.com",25)  #发件人邮箱中的SMTP服务器,端口是25
30         server.login(my_sender,"邮箱密码")    #括号中对应的是发件人邮箱账号、邮箱密码
31         server.sendmail(my_sender,[my_user,],msg.as_string())   #括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
32         server.quit()   #这句是关闭连接的意思
33     except Exception as e:   #如果try中的语句没有执行,则会执行下面的ret=False
34         print(e)
35         ret=False
36     return ret
37 
38 ret=mail(*******@qq.com)                 #实参
39 if ret:
40     print("ok") #如果发送成功则会返回ok,稍等20秒左右就可以收到邮件
41 else:
42     print("filed")  #如果发送失败则会返回filed
View Code

技术分享

PS:用163邮箱作为发送邮箱时需要先登录163邮箱在“设置”中将SMTP服务器开启!

Python学习——深浅拷贝