1.首先介绍下python的对象引用

1)Python中不存在传值调用,一切传递的都是对象引用,也可以认为是传址调用。即Python不允许程序员选择采用传值或传引用。Python参数传递采用的是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数参数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于通过"传值"来传递对象。

2)当复制列表或字典时,就复制了对象列表的引用,如果改变引用的值,则修改了原始的参数。

3)为了简化内存管理,Python通过引用计数机制实现自动垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象。

2. 可变对象与不可变对象的概念与分类

Python在heap中分配的对象分成2类:

不可变对象(immutable object):Number(int、float、bool、complex)、String、Tuple. 采用等效于“传引用”的方式。

可变对象(mutable object):List、dictionary.采用等效于“传值”的方式。

3. del 是删除引用而不是删除对象,对象由自动垃圾回收机制(GC)删除

看这个例子:

  1. >>> x = 1
  2. >>> del x
  3. >>> x
  4. Traceback (most recent call last):
  5. File "<pyshell#28>", line 1, in <module>
  6. x
  7. NameError: name 'x' is not defined
  8. >>> x = ['Hello','world']
  9. >>> y = x
  10. >>> y
  11. ['Hello', 'world']
  12. >>> x
  13. ['Hello', 'world']
  14. >>> del x
  15. >>> x
  16. Traceback (most recent call last):
  17. File "<pyshell#32>", line 1, in <module>
  18. x
  19. NameError: name 'x' is not defined
  20. >>> y
  21. ['Hello', 'world']
  22. >>>

可以看到x和y指向同一个列表,但是删除x后,y并没有受到影响。这是为什么呢?
The reason for this is that you only delete the name,not the list itself,In fact ,there is no way to delete values in python(and you don’t really need to because the python interpreter does it by itself whenever you don’t use the value anymore)
 举个例子,一个数据(比如例子中的列表),就是一个盒子,我们把它赋给一个变量x,就是好像把一个标签x贴到了盒子上,然后又贴上了y,用它们来代表这个数据,但是用del删除这个变量x就像是把标有x的标签给撕了,剩下了y的标签。
再看一个例子:

  1. shoplist = ['apple', 'mango', 'carrot', 'banana']
  2. print ('The first item I will buy is', shoplist[0])
  3. olditem = shoplist[0]
  4. del shoplist[0] #del的是引用,而不是对象
  5. print ('I bought the',olditem)
  6. print ('My shopping list is now', shoplist)
  7. print(shoplist[0])
  8. 结果为:
  9. The first item I will buy is apple
  10. I bought the apple
  11. My shopping list is now ['mango', 'carrot', 'banana']
  12. mango

实例补充:

  1. #!/usr/bin/evn python
  2. # -*- coding:utf-8 -*-
  3. # Author: antcolonies
  4. '''
  5. python中的内置方法del不同于C语言中的free和C++中的delete
  6. (free和delete直接回收内存,当然存储于该内存的对象也就挂了)
  7. Python都是引用,垃圾回收为GC机制
  8. '''
  9.  
  10. '''
  11. if __name__ == '__main__':
  12. a = 1 # 对象 1 被 变量a引用,对象1的引用计数器为1
  13. b = a # 对象1 被变量b引用,对象1的引用计数器加1
  14. c = a # 对象1 被变量c引用,对象1的引用计数器加1
  15. del a # 删除变量a,解除a对1的引用,对象1的引用计数器减1
  16. del b # 删除变量b,解除b对1的引用,对象1的引用计数器减1
  17. print(c) # 1
  18. '''
  19.  
  20. if __name__=='__main__':
  21. li=['one','two','three','four','five'] # 列表本身不包含数据'one','two','three','four','five',而是包含变量:li[0] li[1] li[2] li[3] li[4]
  22. first=li[0] # 拷贝列表,也不会有数据对象的复制,而是创建新的变量引用
  23. del li[0]
  24. print(li) # ['two','three','four','five']
  25. print(first) # one
  26. list1 = li
  27. del li
  28. print(list1) # ['two', 'three', 'four', 'five']
  29. # print(type(li)) # NameError: name 'li' is not defined

参考链接:

http://www.cnblogs.com/ant-colonies/p/6602742.html

 
 

python的 del 函数是删对象还是删引用的更多相关文章

  1. python中del函数的垃圾回收

    今天学习面向对象里的类被del函数的垃圾回收过程搞的晕头转向,经过了老师的讲解还是是懂非懂,然后看了很多博客慢慢的心里才有了个大概的了解. 刚刚看到一篇博客,觉得讲的很好,转载过来以供参考.以下转自笨 ...

  2. python内置函数 3

    int( [x[, radix]])转换为字符串或数字为纯整数.如果参数是一个字符串,它必须包含一个可能有符号的十进制数作为一个 Python 整 数,可能嵌入空格.以 radix 参数给出的基数为基 ...

  3. Python基础:函数

    一.概述 二.声明.定义和调用 三.参数 1.参数传递 2.实参类型 3.形参绑定 四.返回值 五.名字空间与作用域 1.基本概念 2.名字空间 3.作用域 4.总原则 六.高级 1.装饰器 2.生成 ...

  4. Python中为什么不能用可变对象作为默认参数的值

    def func(numbers = [], num=1): numbers.append(num) for number in numbers: print(number) func() >& ...

  5. [19/10/13-星期日] Python中的函数

    一.函数 # 第五章 函数 ## 函数简介(function) - 函数也是一个对象 - 对象是内存中专门用来存储数据的一块区域 - 函数可以用来保存一些可执行的代码,并且可以在需要时,对这些语句进行 ...

  6. python 内置函数的补充 isinstance,issubclass, hasattr ,getattr, setattr, delattr,str,del 用法,以及元类

    isinstance   是 python中的内置函数 , isinstance()用来判断一个函数是不是一个类型 issubclass  是python 中的内置函数,  用来一个类A是不是另外一个 ...

  7. Python闭包与函数对象

    1. Python闭包是什么 在python中有函数闭包的概念,这个概念是什么意思呢,查看Wikipedia的说明如下: “ In programming languages, closures (a ...

  8. python中的函数对象与闭包函数

    函数对象 在python中,一切皆对象,函数也是对象 在python语言中,声明或定义一个函数时,使用语句: def func_name(arg1,arg2,...): func_suite 当执行流 ...

  9. python函数之第一类对象

    目录 python函数之第一类对象 python函数之第一类对象 第一类对象(英语:First-class object)在计算机科学中指可以在执行期创造并作为参数传递给其他函数或存入一个变数的实体. ...

随机推荐

  1. Django入门与实践-第18章:访问已登录用户(完结)

    http://127.0.0.1:8000/boards/1/topics/1/ #boards/views.py @login_required def new_topic(request, pk) ...

  2. Shell编程-06-Shell中的if语句

    目录 基本语法 if示例     在任何一门语言中,判断语句总是少不了,今天来学习一下Shell中的if语句. 基本语法 单分支情况 第一种语法 if <条件表达式> then 语句 fi ...

  3. spring mvc学习笔记(一)web.xml文件配置的一点重要信息

    通过这个web.xml文件可以看出,所有的*.shtml的请求,都会被springmvc这个servlet处理.这里如果没有指定contextConfigLocation这个参数,将会按照默认规则在c ...

  4. Delphi事件的广播 转

    http://blog.sina.com.cn/s/blog_44fa172f0102wgs2.html 原文地址:Delphi事件的广播 转作者:MondaySoftware 明天就是五一节了,辛苦 ...

  5. hsweb 企业后台管理基础框架

    hsweb 详细介绍 业务功能 现在: 权限管理: 权限资源-角色-用户. 配置管理: kv结构,自定义配置.可通过此功能配置数据字典. 脚本管理: 动态脚本,支持javascript,groovy, ...

  6. Configure Pi as simulation hardware for Simulink

    1. Only version not older than R2013 supports Raspberry Pi. First, download support package in Matla ...

  7. [招聘] 上海耐斯特数字招聘3D图形软件工程师

    公司介绍 上海耐斯特数字科技有限公司成立于2018年9月,致力于为中国原创动画.影视行业提供新一代核心技术解决方案和全流程技术服务.公司创始团队拥有国内外领先的行业背景与资源,在DCC软件开发方面具有 ...

  8. Storm的Metric接口简介

    本文由作者林洋港授权网易云社区发布. 作为服务端程序,我们总是需要向外界报告一些统计数据,以助于了解系统的运行情况,比如某个接口的调用时间.系统处理的请求数等等.当我们的程序以Storm Topolo ...

  9. Kettle 使用入门

    Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定. 本文介绍一个入门例子:使用Kettle从动态指定的文件名对应的文本文件里抽取 ...

  10. python scapy 网卡抓包

    首先需要安装scapy包,点击下载 from scapy.all import * def pack_callback(packet): print packet.show() if packet[' ...