美文网首页
第二节 共享引用

第二节 共享引用

作者: 江山画_孤影 | 来源:发表于2018-04-20 13:02 被阅读0次

在学习之前,先回顾一下两个基础内容

运算符 == 和 is 的区别

  1. == 用于判断对象的value是否相等
  2. is 用于判断对象的id是否相同

可变对象与不可变对象

1.不可变对象:原对象的值不能被改变。如果要改变值,内存必须开辟新的内存地址,用来存储新对象,也就是会产生两个对象,新对象被引用而原来的对象被回收.
不可变对象主要有:数值型(int,float),字符串(str),元组(tuple)

2.可变对象:该对象可以在其内存地址(id)不变的情况下修改值.
可变对象主要有:列表(list),字典(dict),集合(set)

进入正题:前面我们看到了单个变量赋值的一些情况,现在我们引入另一个变量.

一. 独立赋值——非共享引用

1.1 变量指向不可变对象

例1 例1

1.2 变量指向可变对象

例2 例4 代码展示的结果

小结

独立赋值的情况下,不管对象如何,变量资源都是非共享的.只不过当变量指向的对象是可变对象,内存会开辟两个空间地址分别存储.

二. 复制

2.1 源对象为不可变对象(非共享引用)

例2

2.2 源对象为可变对象 (共享引用)

例3 代码展示的结果

小结

  1. b = a 的本质其实是b复制了a对对象的指向.不管哪种数据类型,原来a指向哪个对象,b也会指向这个对象.
  2. 资源共不共享其区别在于对象自身即可变对象与不可变对象.

总结

5.png

问题

以列表为例,有的时候,我们偏偏需要将一份数据的原始内容保留一份,再去处理数据,这时候你只能通过独立赋值,但是赋值得把原来的数据重新再写一遍,很麻烦,python为这种需求提供了copy模块,提供了两种主要的方法,一种是普通的copy,另一种是deepcopy。我们称前者是浅拷贝,后者为深拷贝。可以发现深浅拷贝其实都是为了解决可变对象的.

相关文章

  • 第二节 共享引用

    在学习之前,先回顾一下两个基础内容 运算符 == 和 is 的区别 == 用于判断对象的value是否相等 is...

  • 僵化的创意

    (引用) 以上。共享。

  • Unreal 智能指针

    TSharedPtr 共享指针 TSharedRef 共享引用 TWeakPtrTSharedPtr 弱指针 TU...

  • JavaScript深入之参数按值传递

    除了按值传递、引用传递,还有第三种传递方式 —— 按共享传递(JS应该是共享传递,没有所谓的引用传递) 共享传递是...

  • 参数按值传递

    参数如果是基本类型是按值传递,如果是引用类型按共享传递。 1、按值传值 2、共享传值 共享传值: 按引用传递是传...

  • JavaScript: 关于继承多种实现的笔记

    原型链继承 先说原型链继承的问题:包含引用类型属性的原型(不想被共享的引用属性)会变成共享。 根据超类,color...

  • 2020-04-01 继承

    原型链继承 缺点:引用类型会共享 构造函数继承 优点:不会共享,还可以给父类传参 缺点:函数也属于引用类型。所以每...

  • 第二天函数

    今天学习函数的第二节 一、绝对、相对引用F4(重要) 引用是用工作簿、工作表和单元格地址来引用其中的值。 引用单元...

  • JavaScript学习 之 传值or传引用

    目录 引言 传值? 传引用? 基础类型传值-对象类型传引用? 传共享! 小结 引言 JavaScript的函数参数...

  • Tomcat server.xml优化

    1. 使用线程池处理HTTP请求 name:共享线程池的名字。这是Connector为了共享线程池要引用的名字,该...

网友评论

      本文标题:第二节 共享引用

      本文链接:https://www.haomeiwen.com/subject/ttdpkftx.html