• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > Python中的引用和拷贝浅析

Python中的引用和拷贝浅析

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了python 拷贝文件,python 深拷贝,python 拷贝,python 浅拷贝,python 浅拷贝 深拷贝等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

If an object's value can be modified, the object is said to be mutable. If the value cannot be modified,the object is said to be immutable.

mutable 可变类型,例如 list,set,自定义类型(等价于C#中的引用类型);

immutable 不可变类型,例如string,numbers等(等价于C#中的值类型);

一、引用和拷贝(references and copies)

当程序中使用=赋值操作符时,例如a=b,

对于不可变的对象,a作为b的一个拷贝被创建,a和b将指向不同的内存地址,a和b相互独立。
def TestCopy():
    a = 10
    b = a
    a =20
    print (b) #b still is 10
</div>
但是对于可变的对象,a作为b的一个引用被创建,a和b的元素公用相同的内存地址,a和b的元素共享。
def TestRef():
    a=[1,2,3,4]
    b=a   #b is a reference to a
    print (b is a) # True
    b[2] = -100 #change an element in b
    print (a) # a also changed to [1,2,-100,4]
</div>

二、深拷贝和浅拷贝(shallow copy and deep copy)

为了避免可变对象指向同一个对象,必须创建一个新的拷贝,而不是引用。
在python中可以对容器对象(例如lists和dictionaries)使用两种拷贝:浅拷贝和深拷贝。
 
浅拷贝创建一个新的对象,但是使用原来对象的元素的引用(如果是不变类型,相当于是拷贝)来填充新对象。可以使用copy.copy()来实现浅拷贝。
def TestShallowCopy():
    a = [ 1, 2, [3,4] ]
    b = list(a) # create a shallow copy of a
    print (b is a) #False
    b.append(100) #append element to b
    print (b)
    print (a) # a is unchanged
    b[2][0] = -100 # modify an element inside b
    print (b)
    print (a)  # a is changed
</div>

在这个例子中,a和b共享相同的可变元素。所以修改其中一个list对象中的元素,另一个list对象也会被修改。

深拷贝创建一个新的对象,同时递归地拷贝对象所包含的所有的元素。可以使用copy.deepcopy()来实现深拷贝。

def TestDeepCopy():
  import copy
  a = [1, 2, [3, 4]]
  b = copy.deepcopy(a)
  b[2][0] = -100
  print (b)  # b is changed
  print (a)  # a is unchanged
</div>

在这个例子中,a和b是对立的list对象,且他们的元素也相互独立。

三、引用计数和垃圾回收

python中的所有的对象都是引用计数的,一个对象赋值或加入容器时,它的引用计数就会自增,当使用del时或变量赋值为其他值时,引用计数就会自减,当引用计数为0时,python的垃圾回收器就会回收该变量。
def TestGarbageCollection():
  import sys
  print(sys.getrefcount(37))
  a = 37 # Creates an object with value 37
  print(sys.getrefcount(37))
  b = a # Increases reference count on 37
  print(sys.getrefcount(37))
  c = []
  c.append(b) # Increases reference count on 37
  print(sys.getrefcount(37))
  del a # Decrease reference count of 37
  print(sys.getrefcount(37))
  b = 42 # Decrease reference count of 37
  print(sys.getrefcount(37))
  c[0] = 2.0 # Decrease reference count of 37
  print(sys.getrefcount(37))
 
TestGarbageCollection()
</div>

运行结果为:

11
12
13
14
13
12
11
</div>
为啥一上来就有11个引用了呢?谁知道?

</div>

您可能想查找下面的文章:

  • Python实现拷贝多个文件到同一目录的方法
  • 深入理解python中的浅拷贝和深拷贝
  • Python中的深拷贝和浅拷贝详解
  • Python浅拷贝与深拷贝用法实例
  • 解析Python中的变量、引用、拷贝和作用域的问题
  • Python中的赋值、浅拷贝、深拷贝介绍
  • Python中的引用和拷贝浅析
  • Python中的引用和拷贝浅析
  • 用python实现的可以拷贝或剪切一个文件列表中的所有文件

相关文章

  • 从零学Python之入门(五)缩进和选择
  • python如何在终端里面显示一张图片
  • Python3基础之条件与循环控制实例解析
  • python 中文乱码问题深入分析
  • Python脚本实现DNSPod DNS动态解析域名
  • Python读取ini文件、操作mysql、发送邮件实例
  • 简单介绍Python的Tornado框架中的协程异步实现原理
  • 在Python的Flask框架中使用日期和时间的教程
  • python开发简易版在线音乐播放器
  • python读写json文件的简单实现

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Python中的闭包详细介绍和实例
    • python常用函数详解
    • Python程序设计入门(2)变量类型简介
    • 利用pyinstaller或virtualenv将python程序打包详解
    • python通过邮件服务器端口发送邮件的方法
    • 在Python中操作时间之tzset()方法的使用教程
    • Python实现新浪博客备份的方法
    • Python发送form-data请求及拼接form-data内容的方法
    • 在python的类中动态添加属性与生成对象
    • 使用python绘制常用的图表

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有