文章目录
python是解释型语言
编译型语言
- c语言类型不对是编译抛的错误
- c需要整个编译过了才能运行
- 在程序执行前,需要把源代码编译成机器语言的文件,再执行时可以直接使用该编译结果,以后不需要再次编译。
- 优点:运行效率高
- 缺点:难以移植
解释型语言
- python报错是运行抛的错误
- 代码执行时才一行行动态翻译执行
- 优点:无需翻译器,方便程序移植;可以交互式运行
- 缺点:运行效率较低
C++语言与Java语言的区别有哪些
- 都是面向对象的编程语言,支持封装、继承和多态;
- Java 不提供指针来访问内存,这和 C++ 有着很大的不同;
- Java的类是单继承的,不然会有菱形问题,C++ 支持多继承,Java 通过接口的形式实现了某种意义上的多继承;
- Java有虚拟机,源代码经过编译后生成的字节码可以直接运行的虚拟机上,从而实现了跨平台的需求;
- Java有垃圾回收机制,开发者不需要主动管理内存空间。
可变对象和不可变对象
不可变对象(数值、字符、元组)
list、dict、set
可变对象(列表、字典等)
int、tuple、str、bool
深拷贝、浅拷贝和等号赋值
赋值
赋值其实就是将一个对象的地址赋值给一个变量,使得变量指向该内存地址。
浅拷贝:两种情况
-
浅拷贝的值是不可变对象时,和等于赋值一样,对象的id值和浅拷贝原来的值相同;
-
如果是可变对象
a. 一个简单的没有嵌套的对象,复制前后的对象相互之间不会影响
- 列表本身的浅拷贝对象的地址和原对象的地址是不同的,因为列表是可变数据类型
- 列表中的元素(第1个元素为例)和浅拷贝对象中的第一个元素的地址是相同的,因为元素本身是数值型,是不可变的
b. 对象中有复杂子对象,如列表嵌套,如果改变原来的对象中复杂子对象的值,浅拷贝的值也会受影响,因为在浅拷贝时只复制了子对象的引用(只拷贝父对象)。
在可变类型的数据中,如果存在嵌套的结构类型,浅拷贝只复制最外层的数据,导致内存地址发生变化,里面数据的内存地址不会变
深拷贝
深拷贝:新建一个对象,把原来对象的内存完全复制过来,改变复制后的对象,不会改动原来内存的内容。(两个对象在复制之后是完全独立的对象)
- 不可变对象
- 可变对象
a. 不存在嵌套
b.存在嵌套
结论1:对整个存在嵌套类型的数据进行深浅拷贝都会发生内存的变化,因为数据本身是可变的
结论2:我们查看第一个元素1的内存地址,发生三者是相同的,因为1是属于数值型,是不可变类型
结论3:我们查看第三个元素即里面嵌套列表的内存,发现只有深拷贝是不同的,因为这个嵌套的列表是可变数据类型,深拷贝在拷贝了最外层之后还会继续拷贝子层级的可变类型
结论4:我们查看嵌套列表中的元素的内存地址,发现它们是相同的,因为元素是数值型,是不可变的,不受拷贝的影响
结论
浅拷贝只会拷贝最外层的数据
深拷贝会拷贝所有层级的可变类型数据
is和==的区别
- is判断两个对象的内存地址是否相同
- ==判断两个对象的值是否相同