python的知识又增加惹

本文探讨了Python作为解释型语言与C/C++的编译型语言特性,强调了运行时错误与编译时错误的区别。同时,文章深入解析了Python中可变对象与不可变对象的概念,如列表、字典、元组与数值、字符之间的差异。详细阐述了浅拷贝与深拷贝的区别,并通过实例展示了它们在内存管理上的不同影响。最后,介绍了is与==操作符在判断对象身份与值相等时的不同用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python是解释型语言

编译型语言

  • c语言类型不对是编译抛的错误
  • c需要整个编译过了才能运行
  • 在程序执行前,需要把源代码编译成机器语言的文件,再执行时可以直接使用该编译结果,以后不需要再次编译。
  • 优点:运行效率高
  • 缺点:难以移植

解释型语言

  • python报错是运行抛的错误
  • 代码执行时才一行行动态翻译执行
  • 优点:无需翻译器,方便程序移植;可以交互式运行
  • 缺点:运行效率较低

C++语言与Java语言的区别有哪些

  • 都是面向对象的编程语言,支持封装、继承和多态;
  • Java 不提供指针来访问内存,这和 C++ 有着很大的不同;
  • Java的类是单继承的,不然会有菱形问题,C++ 支持多继承,Java 通过接口的形式实现了某种意义上的多继承;
  • Java有虚拟机,源代码经过编译后生成的字节码可以直接运行的虚拟机上,从而实现了跨平台的需求;
  • Java有垃圾回收机制,开发者不需要主动管理内存空间。

可变对象和不可变对象

不可变对象(数值、字符、元组)

list、dict、set
在这里插入图片描述

可变对象(列表、字典等)

int、tuple、str、bool
在这里插入图片描述

深拷贝、浅拷贝和等号赋值

赋值

赋值其实就是将一个对象的地址赋值给一个变量,使得变量指向该内存地址。

浅拷贝:两种情况

  1. 浅拷贝的值是不可变对象时,和等于赋值一样,对象的id值和浅拷贝原来的值相同;
    在这里插入图片描述

  2. 如果是可变对象

a. 一个简单的没有嵌套的对象,复制前后的对象相互之间不会影响
在这里插入图片描述

  • 列表本身的浅拷贝对象的地址和原对象的地址是不同的,因为列表是可变数据类型
  • 列表中的元素(第1个元素为例)和浅拷贝对象中的第一个元素的地址是相同的,因为元素本身是数值型,是不可变的

在这里插入图片描述

b. 对象中有复杂子对象,如列表嵌套,如果改变原来的对象中复杂子对象的值,浅拷贝的值也会受影响,因为在浅拷贝时只复制了子对象的引用(只拷贝父对象)。
在这里插入图片描述

在可变类型的数据中,如果存在嵌套的结构类型,浅拷贝只复制最外层的数据,导致内存地址发生变化,里面数据的内存地址不会变

深拷贝

深拷贝:新建一个对象,把原来对象的内存完全复制过来,改变复制后的对象,不会改动原来内存的内容。(两个对象在复制之后是完全独立的对象)

  1. 不可变对象
    在这里插入图片描述
  2. 可变对象
    a. 不存在嵌套
    在这里插入图片描述
    在这里插入图片描述

b.存在嵌套
在这里插入图片描述

结论1:对整个存在嵌套类型的数据进行深浅拷贝都会发生内存的变化,因为数据本身是可变的
在这里插入图片描述

结论2:我们查看第一个元素1的内存地址,发生三者是相同的,因为1是属于数值型,是不可变类型

在这里插入图片描述

结论3:我们查看第三个元素即里面嵌套列表的内存,发现只有深拷贝是不同的,因为这个嵌套的列表是可变数据类型,深拷贝在拷贝了最外层之后还会继续拷贝子层级的可变类型
在这里插入图片描述

结论4:我们查看嵌套列表中的元素的内存地址,发现它们是相同的,因为元素是数值型,是不可变的,不受拷贝的影响

结论

浅拷贝只会拷贝最外层的数据
深拷贝会拷贝所有层级的可变类型数据

is和==的区别

  • is判断两个对象的内存地址是否相同
  • ==判断两个对象的是否相同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值