直接赋值

赋值是 b = a: 赋值引用,a 和 b 都指向同一个对象,内存地址相同,即a is b。

赋值不是浅拷贝。

>>> a = [1, 2, 3]
>>> b = a
>>> id(a), id(b)
(140579276041800, 140579276041800)
>>> a, b
([1, 2, 3], [1, 2, 3])
>>> a == b
True
>>> a is b
True
>>> a.append(4)
>>> a, b
([1, 2, 3, 4], [1, 2, 3, 4])

copy() 浅拷贝:

创建一组拷贝对象的引用。(浅拷贝会创建一个新对象,新对象和原对象指向同一内存地址,但新对象和原对象本身内存地址不同,即值相等,内存地址不等。例:b = copy.copy(a),a==b,但a is not b)

如果原对象的可变对象改变(list),那么新对象随之改变,
如果原对象某位置的不可变对象被替换成其他值,  那么新对象将仍然用原对象的原引用值,不随之改变。

也就是说,因为浅拷贝是拷贝对象的引用,可变对象会随着原对象的改变而改变,不可变对象不变。

PS:切片操作是浅拷贝,会生成一个新的对象( id(新对象) != id(原对象) ),新的对象里保存原对象的引用。

例如:

>>> import copy
>>> l
[100, 2, 3, [2, 3, 4]]
>>> l2 = copy.copy(l)
>>> l2
[100, 2, 3, [2, 3, 4]]
>>> l[0]=-1
>>> l
[-1, 2, 3, [2, 3, 4]]
>>> l2
[100, 2, 3, [2, 3, 4]]
>>> l[-1].append(10000)
>>> l
[-1, 2, 3, [2, 3, 4, 10000]]
>>> l2
[100, 2, 3, [2, 3, 4, 10000]]
>>> a = [1,2,3]
>>> id(a)
47973832L
>>> id(a[0])
41902968L
>>> a[0]=5
>>> id(a[0])
41902872L
>>> id(a)
47973832L
>>> a
[5, 2, 3]
>>> c = a[:]
>>> id(c[0])
41902872L
>>> id(a[0])
41902872L
>>> id(a[1])
41902944L
>>> id(c[1])
41902944L
>>> id(c[2])
41902920L
>>> id(a[2])
41902920L
>>> a.append(100)
>>> a
[5, 2, 3, 100]
>>> c
[5, 2, 3]
>>> a[0] = -1
>>> id(a[0])
41903016L
>>> id(c[0]) # a改变了,c仍然引用原对象
41902872L

  

deepcopy() 深拷贝:

对于原对象,不可变类型使用对象引用,可变类型直接复制一份。无论原对象如何改变,深拷贝出来的对象都不变。

>>> l3 = [1,2,3,"abc",[20,30,40]]
>>> l4 = copy.deepcopy(l3)
>>> l4
[1, 2, 3, 'abc', [20, 30, 40]]
>>> l3[0] = 0
>>> l3
[0, 2, 3, 'abc', [20, 30, 40]]
>>> l4
[1, 2, 3, 'abc', [20, 30, 40]]
>>> l3[-1].append(50)
>>> l3
[0, 2, 3, 'abc', [20, 30, 40, 50]]
>>> l4
[1, 2, 3, 'abc', [20, 30, 40]]

  

Python copy(), deepcopy()的更多相关文章

  1. Python copy and deepcopy

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  2. Python copy对象(copy与deepcopy)

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  3. Python 浅拷贝copy()与深拷贝copy.deepcopy()

    首先我在这介绍两个新的小知识,要在下面用到.一个是函数 id() ,另一个是运算符 is.id() 函数就是返回对象的内存地址:is 是比较两个变量的对象引用是否指向同一个对象,在这里请不要和 == ...

  4. Python 函数参数引用(传值/传址)/copy/deepcopy

    精简版: 传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组 ...

  5. Python 传值和传址 copy/deepcopy

    传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如 ...

  6. python copy和deepcopy

    Python FAQ2:赋值.浅拷贝.深拷贝的区别? 发表于 2014-08-15   |   分类于 Lang.-Python  |   在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷 ...

  7. [Python] 等号赋值, copy, deepcopy的区别

    参考链接: 1. 介绍python中的可变类型与不可变类型:https://blog.csdn.net/answer3lin/article/details/86430074 (也可以参考转载博客 P ...

  8. python copy与deepcopy (拷贝与深拷贝)

    copy与deepcopy python 中的copy与deepcopy是内存数据的操作,但是两个函数有一定的区别. 1.copy import copy list = [1, [4, 5, 6], ...

  9. Python面试题之copy/deepcopy详解

    copy和deepcopy有什么区别? http://blog.csdn.net/qq_32907349/article/details/52190796 http://iaman.actor/blo ...

随机推荐

  1. git bash 常用操作文件命令行

    1, cd : change directory的简写,改变目录的意思,就是切换到哪个目录下, 如 cd e:\fff 切换 E 盘下面的fff 目录. 当我们用cd 进入文件夹时,我们可以使用 通配 ...

  2. js中的定义变量之①用不用var

    var 是js定义变量的意思. 由于js中的变量是弱类型的,因此js中的所有变量包括number(数字型).string(字符串类型).boolean(布尔类型,true和false)等均通过var关 ...

  3. 20190725-Silly

    $ \mathsf{You\ think\ about\ what\ you\ want\ because\ you're\ just\ alive}$ ——C418-Alive 我不能yuanlia ...

  4. C# params 用法简介

    params 是C#的关键字, params主要是在声明方法时参数类型或者个数不确定时使用,关于params 参数数组,需掌握以下几点: 一.参数数组必须是一维数组 二.不允许将params修饰符与r ...

  5. springmvc框架通过web.xml配置404 500错误导向页

    总不能用户输错了url就弹 这玩意吧? <error-page> <error-code>404</error-code> <location>/WEB ...

  6. maven的hibernate4 依赖

    <!-- 添加Hibernate4依赖 --> <dependency> <groupId>org.hibernate</groupId> <ar ...

  7. git diff 笔记

    有一个 lab1 一个lab2 lab2 是比lab1 新的版本 但是Lab1 中有一些写的新代码,想要保留到lab2 中 直接使用patch 会把 lab2 回退到lab1 或lab1 更新到lab ...

  8. cmake how to create vs file filters

    用cmakelists构建出来的工程,没有文件filters,可采用如下方法解决 set(SOURCE_LIST "lotteryTicket.cpp" "stdafx. ...

  9. 上传同步github

    …or create a new repository on the command line   echo "# testproject" >> README.md ...

  10. [leetcode] Reverse Words in a String [1]

    一.题目: Given an input string, reverse the string word by word. For example, Given s = "the sky i ...