1 下载Python
2 安装Python
这里就不过多讲述这些,下载完安装包之后,直接点击下一步即可,记得添加到环境变量(Windows)
2.1 添加环境变量
【我的电脑】->【属性】->【高级系统设置】->【环境变量】->【系统变量】->【path】
3 pip的使用
3.1 pip install xxx
功能:通过pip
命令来安装三方包,这里以requests
为例:
pip install requests
3.2 pip list
功能:显示本地已经安装的三方包,如:
3.3 pip -V(upper letter)
功能:显示Python的路径以及当前版本号,如:
3.4 其他 pip -h
功能:显示帮助信息,其他的更多的信息可以通过该命令查看,或者参考这里
4 Python中的变量
本章前提:id()
,该方法是用来显示变量在内存中的地址的。
4.1 不可变数据类型
不可变数据类型表示,如果某变量的值发生了变化,那么必须重新分配一个内存空间来盛放这个新的值。Python中的几种不可变数据类型:number
,str
,tuple
。
4.1.1 number
Python中支持4中不同数值型的数据类型(参考):
- int(整型)
- long integters(长整型)
- floating point real values(浮点型)
- complex numbers(复杂数值型)
举例:
4.1.2 str
字符串类型也是不可信数据类型。
举例:
字符串的特性:
- 截取
- 连接
(1)截取
随便截取:
截取到倒数第一位为止:
截取所有:
这种截取方式相当于:t=s
,即直接赋值。
(2)连接
这种方式比较简单,就是直接用+
号将前后两个字符串连接成一个。
4.1.3 tuple
元组是Python中的一种不可变数据类型,用小括号()
包起来。
定义元祖:
- 直接用小括号包起来,如果只有一个变量,那么末尾加一个
,
,用以区分元组和普通变量 - 用
tuple
关键字定义
举例:
(1)直接用()
包起来
(2)用tuple
关键字定义
4.2 可变数据类型
4.2.1 list
Python中的list
是一种比较灵活的数据结构,也是一种可变数据结构,看下面的例子:
下面这种情况,和我们以为的可能不太一样:
你觉得a
和b
是同一个对象吗?
注意:
当我们使用
=
进行列表的赋值的时候,我们要注意,默认情况下,=
表示的是一种浅拷贝,即直接将=
左边的变量的指针指向=
右边的变量的内存空间,当右边的变量改变的时候,左边的变量也跟着改变,当我们在写程序的时候,这种方式显然不够安全。别不用着急,可以使用Python
中的深拷贝进行赋值。
深拷贝:
深拷贝与浅拷贝的示意图:
浅拷贝和赋值的区别?
- 当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
- 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。
(1)浅拷贝和赋值举例:Python
中有一个自带包copy
,该包中的copy
代表浅拷贝,deepcopy
代表深拷贝。
从图中我们可以看到,通过赋值的方式得到的list_3
的地址和list_1
的地址是一样的,这就印证了上面说的,赋值就是直接将指针指向源数据的内存空间。而浅拷贝则不然,浅拷贝则是赋值了一遍数据,但是复制也不是全盘复制,而是有条件的赋值,即如果该属性是基本类型(基本数据类型也可理解为不可变的数据结构,如int
,str
,’long int’等)就直接将该基本类型的值拷贝一份到新的内存中,如果该属性是一个内存地址(也就是说是可变的数据结构,通常这种数据类型在内存中是一种引用的方式,即内存地址),那么就将内存地址复制一份到新的内存中,那么如果该内存地址中的源数据改变了,新复制的数据中该内存地址所指向的数据也会改变,因为它们指向的是同一个数据。
(2)深拷贝举例:
深拷贝就和其他的编程语言(比如java
)的一致了,就是直接一模一样拷贝一份,源数据和新被赋值的数据进水不犯河水。它们的各自改变不会互相影响。
看下面的例子:
关于深拷贝和浅拷贝的具体更深的内容,可以参考这篇博客:https://juejin.im/post/5b5dcf8351882519790c9a2e
4.2.2 dict
字典是Python
中的一种key-value
的键值对形式的数据结构,也是一种可变的数据结构,基本原理和上一节讲的list
差不多,这里简单介绍一下。
(1)字典赋值的举例:
关于python
中的这种数据赋值,我们叫它赋值,不如叫它给真正的数据对象取一个别名,这就好理解了。
我们可以看到,字典的赋值和列表的赋值其实是一样的,都是简单粗暴的直接指针指过去,dict_1
和dict_2
是联动的。如我们修改dict_1
的name
属性,dict_2
的name
属性也改变了:
(2)字典的浅拷贝举例:dict.copy()
和from copy import copy
的区别?
dict.copy()
:这种拷贝只是拷贝第一层,如果字典中还嵌套有可变数据类型,还是一样,只拷贝引用即地址,不会真正拷贝数据。from copy import copy
中导入的copy
是浅拷贝的包,但是用在字典上,会拷贝第一层,再往下就不会再拷贝了。
举例:dict.copy()
举例:
我们可以看到,基本类型都是已经拷贝了,所以dict_2
的age
属性并没有改变。接着看修改可变数据类型之后的情况:
(3)字典的深拷贝举例:
写在最后
欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。