返回顶部
首页 > 资讯 > 后端开发 > Python >Python编程学习3:Python 对
  • 759
分享到

Python编程学习3:Python 对

Python 2023-01-31 02:01:58 759人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

面试遇到一个问题:如何删除一个python对象?下面将介绍Python的对象引用和 del删除引用1.  首先介绍下python的对象引用1)Python中不存在传值调用,一切传递的都是对象引用,也可以认为是传址调用。即Python不允许

面试遇到一个问题:如何删除一个python对象?

下面将介绍Python的对象引用和 del删除引用

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.采用等效于“传值”的方式。

Python的数据类型和c不太一样,有一种分类标准,可变(mutable)/不可变(immutable).

我理解的可变,就是在内存中的那块内容(value)是否可以被改变。如果是不可变的,在对对象本身操作的时候,必须在内存的另外地方再申请一块区域(因为老区域#不可变#),老的区域就丢弃了(如果还有其他ref,则ref数字减1,类似unix下的hard-link)。如果是可变的,对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。

list1 = [1, 2, 3]
list2 = list1
list3 = list1
print('list1=', list1, '\nlist2=', list2, '\nlist3=', list3)
print('id(list1)=', id(list1), '\nid(list2)=', id(list2), '\nid(list3)=', id(list3))
list1= [1, 2, 3] 
list2= [1, 2, 3] 
list3= [1, 2, 3]
id(list1)= 2604378467016 
id(list2)= 2604378467016 
id(list3)= 2604378467016

一开始list1,list2,list3的取值和id都相同

list2 = list2 + [4]      # 不可变类型操作
print('list1=', list1, '\nlist2=', list2, '\nlist3=', list3)
print('id(list1)=', id(list1), '\nid(list2)=', id(list2), '\nid(list3)=', id(list3))
list1= [1, 2, 3] 
list2= [1, 2, 3, 4] 
list3= [1, 2, 3]
id(list1)= 2604378467016 
id(list2)= 2604378402376 
id(list3)= 2604378467016

进行操作 list2 = list + [4] 这个不可变类型操作后,list1和list3没有受到影响,list2的值和id都发生变化。

list2 += [4]      # 可变类型操作
print('list1=', list1, '\nlist2=', list2, '\nlist3=', list3)
print('id(list1)=', id(list1), '\nid(list2)=', id(list2), '\nid(list3)=', id(list3))
list1= [1, 2, 3] 
list2= [1, 2, 3, 4, 4] 
list3= [1, 2, 3]
id(list1)= 2604378467016 
id(list2)= 2604378402376 
id(list3)= 2604378467016

进行操作list2 += [4] 这个可变类型操作后,list2的内容和id均发生变化

list3.append(5)         # 可变类型操作
print('list1=', list1, '\nlist2=', list2, '\nlist3=', list3)
print('id(list1)=', id(list1), '\nid(list2)=', id(list2), '\nid(list3)=', id(list3))
list1= [1, 2, 3, 5] 
list2= [1, 2, 3, 4, 4] 
list3= [1, 2, 3, 5]
id(list1)= 2604378467016 
id(list2)= 2604378402376 
id(list3)= 2604378467016

列表append()操作是可变类型操作,执行list3.append(5)之后,list1和list3指向的列表元素发生变化,但是id不变。

 3. del 是删除引用而不是删除对象,对象由自动垃圾回收机制(GC)删除,当某个对象的所有引用都被删除后,会自动执行魔法方法__del__来清除此垃圾。


可以看到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的标签。

再看一个例子:


# 本文转自 https://www.cnblogs.com/ant-colonies/p/6602742.html

--结束END--

本文标题: Python编程学习3:Python 对

本文链接: https://lsjlt.com/news/186380.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python编程学习3:Python 对
    面试遇到一个问题:如何删除一个python对象?下面将介绍python的对象引用和 del删除引用1.  首先介绍下python的对象引用1)Python中不存在传值调用,一切传递的都是对象引用,也可以认为是传址调用。即Python不允许...
    99+
    2023-01-31
    Python
  • 【python】编程学习练习题--3
      1 #利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456:代码:  2    3 from functools import reduce   4 str = '123.456'...
    99+
    2023-01-31
    练习题 python
  • Python 3 学习笔记:面向对象编程
    概述 面向对象编程(Object Oriented Programming,即 OOP),是一种程序设计思想,比面向过程编程更加灵活,更易扩展。 Python 在设计的时候就是按照面向对象编程的思想设计的,像我们前面学过的各种数据类型,如字...
    99+
    2023-01-31
    面向对象 学习笔记 Python
  • 学习python[3] python 读
    转载自:http://blog.csdn.net/yukin_xue/article/details/9769803 Python直接读取中文路径的文件时失败,可做如下处理: dst3 = "D:/test/测试文件夹.txt...
    99+
    2023-01-31
    python
  • python学习整理--3/3
    今天又重新学起了python这门语言,带着新的目的和又涨一岁的自己,其实早在去年的暑期曾学过一段时间,但是最后无疾而终,这次我真心希望可以掌握一门实用的语言来充实自己,之前的学的不论是c还是java,自我感觉除了做题以外一点都用不上,但感觉...
    99+
    2023-01-31
    python
  • python学习-3 python基础-
    1.基础知识 ~后缀名是可以是任意的 ~导入模块时,如果不是.py就会报错 =》》所以尽量后缀名携程.py 2.执行方式 -python解释器 3.   #!/usr/bin/env python          -----------...
    99+
    2023-01-31
    基础 python
  • python 学习总结3
    Python蟒蛇绘制 一、实现程序如下 1 import turtle 2 turtle.setup (650, 350, 200, 200)#turtle的绘图窗体turtle.setup(width, height, start...
    99+
    2023-01-30
    python
  • Python tkinter学习3 En
    #tk_entry_text.py #学习tk的Entry组件,学习在界面中如何实现输入及显示信息 import tkinter as tk ####################第一步 window = tk.Tk() window....
    99+
    2023-01-31
    Python tkinter En
  • python学习笔记(3)
    在大概了解了程序之后,我也买了本python书学习一下,因为现在新版的python3.4.0已经不再兼容2.x.x的内容,书虽然很新,但是有些例子还是用的过去的。1.比如在3.0中print 42不能再产生输出了,要改成print(42)&...
    99+
    2023-01-31
    学习笔记 python
  • Python学习笔记(3)Python中
    Escape What it does. 含义  \\ Backslash () 反斜杠 \' Single-quote (') 单引号 \" Double-quote (") 双引号 \a ASCII bell (BEL) 响铃符 \b...
    99+
    2023-01-31
    学习笔记 Python
  • Python学习之面向对象编程详解
    目录什么是面向对象编程(类)类的关键字 - class类的定义与使用类的参数 - selfself 的解析与总结类的构造函数构造函数的创建方法关于对象的生命周期什么是面向对象编程(类...
    99+
    2024-04-02
  • python学习3-python变量以及
    一、变量变量格式:变量名 = 变量值 例子:[root@localhost~]# pythonPython2.7 (r27:82500, Jul 28 2016, 02:42:00) [GCC4.4.7 20120313 (Red Hat ...
    99+
    2023-01-31
    变量 python
  • Python 3 学习笔记:流程控制
    程序结构 计算机在解决某个具体问题时,主要有三种形式,分别是顺序控制执行所有语句、选择执行部分语句和循环执行部分语句。根据以上三种解决问题的形式,程序设计过程中,也有三种基本结构,分别为顺序结构、选择结构和循环结构。 顺序控制 顺序结构很好...
    99+
    2023-01-31
    学习笔记 流程 Python
  • Python学习笔记(3)--- Fla
    在安装flask前,首先安装pip安装地址:https://pip.pypa.io/en/stable/installing.html#install-pip下载(保存):在dos命令下执行 python get-pip.py安装然后 执行...
    99+
    2023-01-31
    学习笔记 Python Fla
  • Python 3 学习笔记:Excel
    安装模块 OpenPyXL 模块是一个第三方模块,所以需要使用 pip 工具安装, pip install openpyxl 文件结构 首先,我们需要了解一下 Excel 文件的基本结构,一个 Excel 文件被称为一个工作薄,工作薄中可以...
    99+
    2023-01-31
    学习笔记 Python Excel
  • linux shell编程学习笔记(3)
    1、什么是变量保存变化的数据——变量名:名称固定,由系统预设或用户自定义——变量值:根据用户设置、系统环境变化而变化2、如何定义变量——变量名=变量的值2.1变量名的规则(1)数字、字母、下划线(2)字母区分大小写(3)当变量名相同时,后赋...
    99+
    2023-01-31
    学习笔记 linux shell
  • python基础学习3----列表
    一.字符格式化输出 占位符 %s s = string 字符串           %d d = digit 整数           %f f = float 浮点数 name = input("Name:") age = int...
    99+
    2023-01-30
    基础 列表 python
  • python 学习笔记 3 -- 数据
    当你创建一个对象并给它赋一个变量的时候,这个变量仅仅 引用 那个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存。这被称作名称到对象的绑定。eg. # -*- coding: utf-8 -*-  shopli...
    99+
    2023-01-31
    学习笔记 数据 python
  • python 学习笔记(3)-转载
    Python中只有一个赋值模型一、缺少类型声明语句的情况在Python中,类型是在运行过程中自动决定的,而不是通过代码声明。这意味着没有必要事声明变量。只要记住,这个概念实质上对变量,对象和它们之间的关系都适用。那么这个概念也容易理解并掌握...
    99+
    2023-01-31
    学习笔记 python
  • Python 3 学习笔记:序列
    序列 索引 序列是一块用于放置多个值得连续存储空间,并且按特定顺序排列,每个值(称为元素)都分配一个整数(由左至右则从 0 开始;由右至左则从 -1 开始),称为索引(index)或位置,如下所示: 可以根据索引获取每个元素实际的值 st...
    99+
    2023-01-31
    序列 学习笔记 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作