赋值

python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间。

a = 123
b = a print(id(a))
print(id(b)) print(a is b) result:

  26848576
  26848576
  True

这里可以看到a和b的地址是一样的,a=123,实质上是将a这个对象"贴到"123上;同样,b=a,也是将b这个对象“贴到”123上,这里变量实际上是个“便利贴“。

下面用一个可变的对象list来做说明:

a = [1, 2, 3]
b = a a.append(4)
a[0] = 6
print(a)
print(b) result:
[6, 2, 3, 4]
[6, 2, 3, 4]

首先把a和b贴在 [1,2,3]这个对象上,然后通过append,[1,2,3]这个对象变成了[1,2,3,4],再通过a[0]=6,将对象[1,2,3,4]的第0个元素地址对应值改为6,

则最终这个对象是[6,2,3,4],然而a和b仍然是贴在这个对象上的,即a和b都是[6,2,3,4]

浅拷贝(copy)

对于浅拷贝有两种情况:

1. 浅拷贝值是不可变对象(数值,字符串,元组)时,等同于赋值,对象的id值与浅拷贝原来的值相同。

import copy

a = 1
b = a
c = copy.copy(a) print(id(a))
print(id(b))
print(id(c)) result:
35258712
35258712
35258712

2. 浅拷贝值是可变对象(list,dict)时:

2.1 不包含子对象

# coding:utf-8
import copy a = [1, 2, 3]
b = a
c = copy.copy(a)
print("append前c={}".format(id(c)))
a.append(4) print("a={}".format(id(a)))
print("b={}".format(id(b)))
print("append后c={}".format(id(c))) print("a值={}".format(a))
print("b值={}".format(b))
print("c值={}".format(c)) result:
append前c=139982846485352
a=139982846912272
b=139982846912272
append后c=139982846485352
a值=[1, 2, 3, 4]
b值=[1, 2, 3, 4]
c值=[1, 2, 3]

对于不包含子对象的情况下,原值的改变并不会影响浅拷贝的值,同时浅复制的值改变也并不会影响原值,并且浅拷贝是新开辟的一块内存,与原对象内存地址不同。

2.2 包含子对象

# coding:utf-8
import copy a = [1, [4], 2, 3]
b = a
c = copy.copy(a)
print("append前c={}".format(id(c)))
a.append(5)
a[1].append(9) print("a={}".format(id(a)))
print("b={}".format(id(b)))
print("append后c={}".format(id(c))) print("a值={}".format(a))
print("b值={}".format(b))
print("c值={}".format(c)) result:
append前c=140519703466856
a=140519703889752
b=140519703889752
append后c=140519703466856
a值=[1, [4, 9], 2, 3, 5]
b值=[1, [4, 9], 2, 3, 5]
c值=[1, [4, 9], 2, 3]

可以看出,浅拷贝只拷贝父对象([1,2,3]),不会拷贝对象内部的子对象([4]),改变原对象中复杂子对象的值时会改变浅拷贝的值。

深拷贝(deepcopy)

# coding:utf-8
import copy a = [1, [4], 2, 3]
print("a原始值={}".format(a))
b = a
d = copy.deepcopy(a) a.append(5)
a[1].append(9) print("a={}".format(id(a)))
print("b={}".format(id(b)))
print("d={}".format(id(d))) print("a值={}".format(a))
print("b值={}".format(b))
print("d值={}".format(d)) result:
a原始值=[1, [4], 2, 3]
a=139675956164440
b=139675956164440
d=139675955741904
a值=[1, [4, 9], 2, 3, 5]
b值=[1, [4, 9], 2, 3, 5]
d值=[1, [4], 2, 3]

深拷贝则会拷贝对象及其子对象,深拷贝的时候会将复杂对象的每一层复制一个单独的个体出来,原对象的值改变时并不会影响deepcopy的值,

但是,由于深拷贝需要维护一个 内存 用于记录已经拷贝的对象,所以深拷贝的速度会比较慢。

深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)的更多相关文章

  1. **Python中的深拷贝和浅拷贝详解

    Python中的深拷贝和浅拷贝详解   这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容.   要说清楚Python中的深浅拷贝,需要 ...

  2. 001 说说Python中的深拷贝和浅拷贝

    在Python编程中忽略深拷贝和浅拷贝可能会造成未知的风险. 比如我们打算保存一份原始对象的副本作为上一状态的记录,此后修改原始对象数据时,若是副本对象的数据也发生改变,那么这就是一个严重的错误. 注 ...

  3. python中的深拷贝和浅拷贝理解

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用.以下分两个思路来分别理解浅拷贝和深拷贝: 利用切 ...

  4. python中的深拷贝与浅拷贝

    深拷贝和浅拷贝 浅拷贝的时候,修改原来的对象,浅拷贝的对象不会发生改变. 1.对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷 ...

  5. python中的深拷贝和浅拷贝

    python的复制,深拷贝和浅拷贝的区别   在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一 ...

  6. 低门槛彻底理解JavaScript中的深拷贝和浅拷贝

    作者 | 吴胜斌 来源 | https://www.simbawu.com/article/search/9 在说深拷贝与浅拷贝前,我们先看两个简单的案例: //案例1var num1 = 1, nu ...

  7. 理解JavaScript中的深拷贝和浅拷贝

    , num2 = num1;console.log(num1) //1console.log(num2) //1num2 = 2; //修改num2console.log(num1) //1conso ...

  8. Python 中的深拷贝和浅拷贝

    一.浅拷贝python中 对象赋值时 默认是浅拷贝,满足如下规律:1. 对于 不可变对象(字符串,元组 等),赋值 实际上是创建一个新的对象:例如: >>> person=['nam ...

  9. python中的深拷贝和浅拷贝(面试题二)

    一.浅拷贝 定义:浅拷贝只是对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值. 浅拷贝的特点: 公用一个值: 这两个变量的内存地址一样: 对其中一个变量的值改变,另外一个变量的值也 ...

随机推荐

  1. [javascript]XMLHttpRequest GET/SET HTTP头与改变HTTP METHOD示例代码

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. git 创建分支

  3. 修改html中button显示的文字

    1. <input type="button">  实现密码输入框的可见和隐藏 直接修改value属性即可 <script type="text/jav ...

  4. Confluence 6 管理 Atlassian 提供的 App

    Confluence 用户可以使用桌面应用来编辑一个已经上传到 Confluence 的文件,然后这个文件自动保存回 Confluence. 这个下载和上传的过程是通过 Atlassian Compa ...

  5. Confluence 6 SQL Server 问题解决

    如果你收到了下面的错误信息,检查你给出的 confluenceuser 用户具有所有需要的数据库权限,当你使用 localhost 进行连接的时候. Could not successfully te ...

  6. php实现备份数据库

    public function dataBackup(){ $doc_root=$_SERVER['DOCUMENT_ROOT']; $file_path_name=$doc_root.'/sqlba ...

  7. WinHex数据恢复笔记(二)

    续写上次笔记: 1.Winhex数据恢复软件的界面上的所有功能已经介绍了一遍,最主要的还是编程恢复的能力. 今天主要看看记事本的编辑恢复及其相关的一些问题,记事本的 编辑值是ASCII值,所以没有文件 ...

  8. Linux基础二:初识linux命令

    一.UNIX和Linux操作系统概述 1.UNIX是什么 1)UNIX的定义: UNIX是一个计算机操作系统,一个用来协调.管理和控制计算机硬件和软件资源的控制程序. 2)UNIX操作系统的特点:多用 ...

  9. 一道面试题 vuex缺点?

    最近去面试的时候,面试官有一道题是让我阐述用vuex的优缺点,优点倒还好说,这个缺点还真没有认识到,有道友可以帮忙解惑嘛? 2 回答 慕标5265247 这种问题一般都有通用回答套路.一件挺好的东西, ...

  10. 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)

    这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 注意情况: 该案例使用的spring-boot版本1.5.x,没使用2.0.x, 另外本文图3 ...