1 下载Python

2 安装Python

这里就不过多讲述这些,下载完安装包之后,直接点击下一步即可,记得添加到环境变量(Windows)

2.1 添加环境变量

【我的电脑】->【属性】->【高级系统设置】->【环境变量】->【系统变量】->【path】
环境变量

3 pip的使用

3.1 pip install xxx

功能:通过pip命令来安装三方包,这里以requests为例:

pip install requests

3.2 pip list

功能:显示本地已经安装的三方包,如:
pip list

3.3 pip -V(upper letter)

功能:显示Python的路径以及当前版本号,如:
pip -V

3.4 其他 pip -h

功能:显示帮助信息,其他的更多的信息可以通过该命令查看,或者参考这里
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(复杂数值型)
    举例:
    number example
4.1.2 str

字符串类型也是不可信数据类型。
举例:
str example
字符串的特性:

  • 截取
  • 连接

(1)截取
随便截取:
截取1
截取到倒数第一位为止:
截取2
截取所有:
截取3
这种截取方式相当于:t=s,即直接赋值。

(2)连接
这种方式比较简单,就是直接用+号将前后两个字符串连接成一个。
连接1

4.1.3 tuple

元组是Python中的一种不可变数据类型,用小括号()包起来。
定义元祖:

  • 直接用小括号包起来,如果只有一个变量,那么末尾加一个,,用以区分元组和普通变量
  • tuple关键字定义

举例:
(1)直接用()包起来
定义1
(2)用tuple关键字定义
定义2

4.2 可变数据类型

4.2.1 list

Python中的list是一种比较灵活的数据结构,也是一种可变数据结构,看下面的例子:
list example
下面这种情况,和我们以为的可能不太一样:
特例1
你觉得ab是同一个对象吗?
答案
注意:

当我们使用=进行列表的赋值的时候,我们要注意,默认情况下,=表示的是一种浅拷贝,即直接将=左边的变量的指针指向=右边的变量的内存空间,当右边的变量改变的时候,左边的变量也跟着改变,当我们在写程序的时候,这种方式显然不够安全。别不用着急,可以使用Python中的深拷贝进行赋值。

深拷贝:
深拷贝与浅拷贝的示意图:
deep and shallow copy
浅拷贝和赋值的区别?

  • 当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
  • 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

(1)浅拷贝和赋值举例:
Python中有一个自带包copy,该包中的copy代表浅拷贝,deepcopy代表深拷贝。
浅拷贝和赋值举例
从图中我们可以看到,通过赋值的方式得到的list_3的地址和list_1的地址是一样的,这就印证了上面说的,赋值就是直接将指针指向源数据的内存空间。而浅拷贝则不然,浅拷贝则是赋值了一遍数据,但是复制也不是全盘复制,而是有条件的赋值,即如果该属性是基本类型(基本数据类型也可理解为不可变的数据结构,如int,str,’long int’等)就直接将该基本类型的值拷贝一份到新的内存中,如果该属性是一个内存地址(也就是说是可变的数据结构,通常这种数据类型在内存中是一种引用的方式,即内存地址),那么就将内存地址复制一份到新的内存中,那么如果该内存地址中的源数据改变了,新复制的数据中该内存地址所指向的数据也会改变,因为它们指向的是同一个数据。

(2)深拷贝举例:
deepcopy
深拷贝就和其他的编程语言(比如java)的一致了,就是直接一模一样拷贝一份,源数据和新被赋值的数据进水不犯河水。它们的各自改变不会互相影响。
看下面的例子:
深拷贝和浅拷贝举例

关于深拷贝和浅拷贝的具体更深的内容,可以参考这篇博客:https://juejin.im/post/5b5dcf8351882519790c9a2e

4.2.2 dict

字典是Python中的一种key-value的键值对形式的数据结构,也是一种可变的数据结构,基本原理和上一节讲的list差不多,这里简单介绍一下。

(1)字典赋值的举例:
关于python中的这种数据赋值,我们叫它赋值,不如叫它给真正的数据对象取一个别名,这就好理解了。
字典赋值的举例
我们可以看到,字典的赋值和列表的赋值其实是一样的,都是简单粗暴的直接指针指过去,dict_1dict_2是联动的。如我们修改dict_1name属性,dict_2name属性也改变了:
联动性

(2)字典的浅拷贝举例:
dict.copy()from copy import copy的区别?

  • dict.copy():这种拷贝只是拷贝第一层,如果字典中还嵌套有可变数据类型,还是一样,只拷贝引用即地址,不会真正拷贝数据。
  • from copy import copy中导入的copy是浅拷贝的包,但是用在字典上,会拷贝第一层,再往下就不会再拷贝了。

举例:
dict.copy()举例:
dict.copy()举例
我们可以看到,基本类型都是已经拷贝了,所以dict_2age属性并没有改变。接着看修改可变数据类型之后的情况:
可变类型的改变

(3)字典的深拷贝举例:
字典的深拷贝举例

写在最后

欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。
微信公众号