Python那些让我疑惑许久的代码--2

  • 疑惑代码--1
    • 疑惑点
    • 解决疑惑点
      • lst2,lst3,lst4的结果随lst1的改变为什么出现的是这样的结果?
        • 别名
          • 常见的引用变量(可变)
          • 常见的值变量(不可变)
        • 浅拷贝
        • 深拷贝
      • c++中的 深拷贝,浅拷贝与python的概率是一样的吗?

疑惑代码–1

import copy
lst1=[1,2,[3,4]]
lst2=lst1
lst3=copy.copy(lst1)
lst4=copy.deepcopy(lst1)
lst1.append([5,6])
print(lst1) #[1, 2, [3, 4], [5, 6]]
print(lst2) #[1, 2, [3, 4], [5, 6]]
print(lst3) #[1, 2, [3, 4]]
print(lst4) #[1, 2, [3, 4]]
lst1[0]=6
print(lst1) #[6, 2, [3, 4], [5, 6]]
print(lst2) #[6, 2, [3, 4], [5, 6]]
print(lst3) #[1, 2, [3, 4]]
print(lst4) # [1, 2, [3, 4]]
lst1[2][0]=4
print(lst1) #[6, 2, [4, 4], [5, 6]]
print(lst2) #[6, 2, [4, 4], [5, 6]]
print(lst3) #[1, 2, [4, 4]]
print(lst4) #[1, 2, [3, 4]]

疑惑点

  • lst2,lst3,lst4的结果随lst1的改变为什么出现的是这样的结果?
  • c++中的 深拷贝,浅拷贝与python的概率是一样的吗?

解决疑惑点

lst2,lst3,lst4的结果随lst1的改变为什么出现的是这样的结果?

在解释前必须要了解的知识点就是lst2,lst3,lst4分别代表的是什么?

  • lst2代表lst1的别名
  • lst3代表浅拷贝
  • lst4代表深拷贝

从上面我们引申了三个概率

  • 别名
  • 浅拷贝
  • 深拷贝

别名

别名这个概念是我在 <<流程的python>>这本书中所看到的,这个说明其实很形象了,例如看过NBA的人都知道小皇帝—>勒布朗·詹姆斯,死神—>杜兰特,萌神(勉扣冠军)—>库里,甜瓜–>安东尼等超级巨星,当我们想到死神时必然会想到杜兰特,nba死神等价于杜兰特,lst2和上面的例子一样lst2等价于lst1,他们只是变了一个变量名称而已,但是都是同一个,所以lst1变了,lst2肯定会变,上面的话语是简单易懂的话语,现在用专业的话语表示为lst2和lst1用的是同一个地址

现在引申另一个问题,为什么lst2=lst1就是让lst1的地址等于lst2
这里我们可以用go语言或者其他语言对于变量分类来介绍,python中列表的赋值是引用传递即赋值是以地址的形式赋值,而另一个传递方式则为值传递,值传递则就是传递值了

常见的引用变量(可变)

字典,列表,数组

常见的值变量(不可变)

数字,字符串,元组等

浅拷贝

浅拷贝与别名的区别在于lst1和lst3的地址是不同的但是lst1中如果还有引用变量的,则lst3中的引用变量会共用同一个地址

所以当引用变量中的引用变量发送改变,浅拷贝也会发送改变

深拷贝

深拷贝和浅拷贝就完全不一样的,他会将该变量全部重新创建新的地址,不管引用变量中是否还有引用变量,其地址都是不一样的

c++中的 深拷贝,浅拷贝与python的概率是一样的吗?

c++的深拷贝,浅拷贝代码

#include <iostream>
#include<cstring>using namespace std;class STRING
{public:STRING( const char* s = "" ) :_str( new char[strlen(s)+1] ){strcpy_s( _str, strlen(s)+1, s );}//STRING( const STRING& s )//{//    //_str = s._str; //浅拷贝的写法//    cout << "拷贝构造函数" << endl;//    _str = new char[strlen(s._str) + 1];//    strcpy_s( _str, strlen(s._str) + 1, s._str );//}//STRING& operator=(const STRING& s)//{//    cout << "运算符重载" << endl;//    if (this != &s)//    {//        //this->_str = s._str; //浅拷贝的写法//        delete[] _str;//        this->_str = new char[strlen(s._str) + 1];//        strcpy_s(this->_str, strlen(s._str) + 1, s._str);//    }//    return *this;//}STRING( const STRING& s ):_str(NULL){STRING tmp(s._str);// 调用了构造函数,完成了空间的开辟以及值的拷贝swap(this->_str, tmp._str); //交换tmp和目标拷贝对象所指向的内容}STRING& operator=(const STRING& s){if ( this != &s )//不让自己给自己赋值{STRING tmp(s._str);//调用构造函数完成空间的开辟以及赋值工作swap(this->_str, tmp._str);//交换tmp和目标拷贝对象所指向的内容}return *this;}~STRING(){cout << "~STRING" << endl;if (_str){delete[] _str;_str = NULL;}}void show(){cout << _str << endl;}
private:char* _str;
};int main()
{//STRING s1("hello linux");//STRING s2(s1);//STRING s2 = s1;//s2.show();const char* str = "hello linux!";STRING  s1(str);STRING s2;s2 = s1;s1.show();s2.show();return 0;
}

python的深拷贝,浅拷贝代码

import copy
class Test:def __init__(self):self.lst=[1,2,3]def __str__(self):return str(self.lst)
t=Test()
t2=t
t3=copy.copy(t)
t4=copy.deepcopy(t)
t.lst[1]=1
print(t,id(t)) #[1, 1, 3] 1399649404352
print(t2,id(t2)) #[1, 1, 3] 1399649404352
print(t3,id(t3)) #[1, 1, 3] 1399649404296
print(t4,id(t4)) #[1, 2, 3] 1399651116928

c++和python的差不多,都是当用到引用变量,浅拷贝都会共用同一个地址,而深拷贝则都是重新创建地址
可能会有人疑问python中t3为什么地址明明不一样但是也发送了改变,其实这里因为t3是对象,对象中含有引用变量,所以当对象中的引用变量发送改变则其浅拷贝也会发送改变

Python那些让我疑惑许久的代码--2相关推荐

  1. Python那些让我疑惑许久的代码

    Python那些让我疑惑许久的代码 疑惑代码1 疑惑点 解决疑惑点 a, b = a[b] = {}, 5的执行流程是怎样的? 为什么会出现{....} 结果是怎么来的 疑惑代码2 疑惑点 解决疑惑点 ...

  2. python入门指南 小说-Python入门指南 作者:许半仙(4)

    Python入门指南 作者:许半仙(4) 字体:[大 中 小] 结果快下班的时候忽然来了个紧急任务,晚上得加班. 受申请了在家办公,把电脑背回家,并告知了攻这一消息. 攻体贴地揉了揉受的脑袋,说:&q ...

  3. 犹豫了许久,还是写个年总结记录一下吧

    之所以犹豫了许久,是因为,直觉告诉我,发这篇文章出来,园子里肯定会掀起波澜,而我却身处于漩涡中央.看到园子没以前那么热闹了,那就来吧,豁出去了,生死看淡,不服就干!一起热闹热闹吧!毕竟很快就要过年啦~ ...

  4. python入门指南by许半仙-Python入门指南 作者:许半仙(4)

    Python入门指南 作者:许半仙(4) 字体:[大 中 小] 结果快下班的时候忽然来了个紧急任务,晚上得加班. 受申请了在家办公,把电脑背回家,并告知了攻这一消息. 攻体贴地揉了揉受的脑袋,说:&q ...

  5. python入门指南by许半仙百度云-Python入门指南 作者:许半仙(4)

    Python入门指南 作者:许半仙(4) 字体:[大 中 小] 结果快下班的时候忽然来了个紧急任务,晚上得加班. 受申请了在家办公,把电脑背回家,并告知了攻这一消息. 攻体贴地揉了揉受的脑袋,说:&q ...

  6. 每日一皮:产品和开发在线上吵了许久...

    产品和开发在线上吵了许久 于是领导开了一个会议室让他们聊聊 - 往期推荐 每日一皮:软件从业人员表情图... 每日一皮:强大的sudo ... 每日一皮:周六了,想跟你说一句... 每日一皮:一个难以 ...

  7. 许久不动笔,,再来点人生感悟吧

    过了许久,方才又上来写点东西了, 人似乎都有很强的惰性,如果不靠纸笔,好像就不能有所沉淀,所有的思绪就如同漂絮一般,虚空的让我只能由以种种好似存在过的感觉. 很久没有更新东西了,真的是忘了怎么样的学习 ...

  8. 【问题记录】更换域名的DNS时,浏览器许久不生效。

    今天把阿里云的域名解析到腾讯云. 我之前绑定过www.111.com. 这次新绑定的域名111.com,几分钟就生效了.可以访问. 但www.111.com许久不行,仍显示老的服务器页面! 休息时,随 ...

  9. Mysql许久不用后服务无法打开,暴力解决法(报错:服务没有报任何错误)

    这篇博文适用于学习阶段数据不多.不重要 许久不用mysql后,打开总是报以下错 暴力解决方案如下 删除data文件夹 管理员身份打开dos窗口 dos进入你的mysql按照目录 例如我的目录是 依次键 ...

最新文章

  1. Spring Boot-Spring Tool Suit + Gradle 构建第一个Spring Boot 项目01
  2. 使用CSS预处理器Less
  3. IM消息送达保证机制实现(二):保证离线消息的可靠投递
  4. OkHttp3中的HTTP/2首部压缩
  5. models.ForeignKey( ,on_delete=models.CASCADE)    # 关联外键
  6. Javascript 中调参数的脚本onclick=select(this) this 怎么解释
  7. php 点击选择图片上传,微信小程序图片选择、上传到服务器、预览(PHP)实现实例...
  8. rem在响应式布局中的应用
  9. 用matlab制作证件照,美图秀秀证件照制作方法图文教程
  10. WIN7操作系统IE11的离线安装(有时间总结下)
  11. 2021年网络安全学习路线指导(含视频教程)
  12. hihocoder1829 Tomb Raider
  13. 【Python】爬虫-----爬取网易云音乐评论信息
  14. HTML、CSS——可伸缩式搜索框
  15. STM32F4之按键(二)
  16. 2018.3版本 CLion的激活码
  17. rtx2060什么水平_老平台升级RTX2060,——性能,功耗,静音都一步到位!
  18. RPA自动化软件汇总
  19. 软考项目管理领域的常见英文术语,特别是 9 大知识领域有关的知识
  20. python3.6安装scrapy出错_python3.6安装scrapy

热门文章

  1. js设置长按esc退出全屏;拦截所有所有按键事件;全屏模式下拦截esc按键;javascript;chrome
  2. php读音量大小,Android_Android中实时获取音量分贝值详解,基础知识 度量声音强度,大 - phpStudy...
  3. 8522A+7段数码管显示实验
  4. 跟小博老师一起学JSP ——通信作用域
  5. SpringMVC简要概述
  6. 联想笔记本声音太小怎么办_笔记本声音太小,详细教您笔记本电脑声音太小解决方法...
  7. python 提示按任意键退出_详解Python实现按任意键继续/退出的功能 python请按任意键继续 什么意思...
  8. Android Studio报错--Error: Library projects cannot set applicationId. applicationId is set to ...
  9. 股市和庞氏骗局的类同之处
  10. KW-Software MULTIPROG平台通过赫优讯cifX板卡实现 集成PROFIBUS-DP主站的软PLC控制器