python入门-变量和赋值

2023-08-23 15:50:26 浏览数 (1)

变量与赋值

其实,Python中的赋值语句我们在之前的学习过程已经接触了很多,比如a=1,就是将数值1赋值给变量a。

在正式介绍赋值语句之前,我们先了解下Python中的变量问题。

环境

系统与环境介绍:

  • 系统:MacOS
  • 工具:jupyter notebook
  • Python版本:3.7.5
  • 文档编辑器:Typora

变量

深刻理解变量的内存地址

变量可以说是一个存放数据的容器。Python中在定义变量的时候,不需要声明变量。当我们首次为变量赋值的时候,会自动创建变量并指定类型。

变量本身是没有类型的,只是对象(赋值的数据)有类型

代码语言:javascript复制
a = 66
a
代码语言:javascript复制
66
代码语言:javascript复制
b = 66
b
代码语言:javascript复制
66
代码语言:javascript复制
type(a)  # 查看数值类型为整型int
代码语言:javascript复制
int
代码语言:javascript复制
type(b)  # 字符串类型
代码语言:javascript复制
int

我们定义了两个变量a和b,它们都是数字66。虽然名称不同,但是在计算机中它们却代表的是同一个元素,看看他们的内存地址。

就好比:猪八戒(数值66)这个人,我们可以称之为“二师兄”(放在变量a),也可以称之为“天蓬元帅”(放在变量b),但是本质上他们都是指猪八戒,只是换了个别名,本质相同

代码语言:javascript复制
id(a)  # a和b的内存地址相同
代码语言:javascript复制
4387310752
代码语言:javascript复制
id(b)
代码语言:javascript复制
4387310752

我们再定义一个变量的赋值看看:

代码语言:javascript复制
a = 77
a
代码语言:javascript复制
77
代码语言:javascript复制
id(a)
代码语言:javascript复制
4387311104

我们看到,之前我们把数值66赋值给变量a,内存地址是4430785696,然后我们又把数值77赋值为变量a,内存地址变成了4430786048。

为什么?其实,这两数值66和77本质上在计算机就是两个对象,只不过它们刚好有个相同的名字而已。好比说,西游记有个情节:真假美猴王

真美猴王(数值66)和假美猴王(数值77)虽然都被称为猴子(标签a),但是他们实际上是两只不同的猴子呀(分配了不同的地址)~假的最后不还是被如来给收服啦!

创建变量

通过赋值语句来实现变量的创建

代码语言:javascript复制
x = 99  # 数值型
language = "python"  # 字符串型
number = [1,3,5,7,9]  # 列表型

print(x)
print(language)
print(number)
代码语言:javascript复制
99
python
[1, 3, 5, 7, 9]

变量名称命名规则

python中变量的命名可以使用短名称,比如上面的x、y、z、a、b等,也可以使用具有一定描述作用的名称,比如age、name、sex,其他人看到就可以知道变量的含义。通常Python中的变量命名规则:

  • 变量名必须以字母或下划线字符开头,不能以数字开头
  • 变量名只能包含字母数字字符和下划线(A-z、0-9 和 _)
  • 变量名称区分大小写(name、Name 和 NAME 就是三个不同的变量)
  • 变量名不能和Python中的关键字冲突(相同),否则无效

下面我们看看Python中常见的赋值方法

赋值语句

常规赋值

赋值:将Python的某个数据对象贴在某个变量上,好像给这个对象贴上了一个标签。Python 使用等号=作为赋值运算符,具体格式为:

代码语言:javascript复制
name = value

# 变量 = 某个值
代码语言:javascript复制
list1 = ["python","java"]  # 列表赋值给变量b
list1
代码语言:javascript复制
['python', 'java']
代码语言:javascript复制
list2 = [1,2,["python","html"],(1,4,7)]  # 嵌套列表
list2
代码语言:javascript复制
[1, 2, ['python', 'html'], (1, 4, 7)]
代码语言:javascript复制
age = 28  # 数值
age
代码语言:javascript复制
28
代码语言:javascript复制
information = "xiaoming is a boy"  # 字符串
information
代码语言:javascript复制
'xiaoming is a boy'
代码语言:javascript复制
# 定义一个变量dic,字典类型

dic = {"name":"xiaoming","age":20,"sex":"fale"}
dic
代码语言:javascript复制
{'name': 'xiaoming', 'age': 20, 'sex': 'fale'}

多变量赋值

同时赋值3个变量

代码语言:javascript复制
m, n, o= 22, "xiaoming","男"  # 同时赋值3个变量
代码语言:javascript复制
m
代码语言:javascript复制
22
代码语言:javascript复制
n
代码语言:javascript复制
'xiaoming'
代码语言:javascript复制
o
代码语言:javascript复制
'男'

上面的例子表示22赋值给m,字符串对象"xiaoming"赋值给n,"男"赋值给变量o

代码语言:javascript复制
name, age = ("Peter",20)  # 通过元组形式赋值
代码语言:javascript复制
name
代码语言:javascript复制
'Peter'
代码语言:javascript复制
age
代码语言:javascript复制
20

上面的例子通过Python元组的形式进行了链式赋值

链式赋值

代码语言:javascript复制
x1 = y1 = 33
代码语言:javascript复制
x1
代码语言:javascript复制
33
代码语言:javascript复制
y1
代码语言:javascript复制
33

在上面的例子中我们通过链式赋值同时定义了两个变量x1和y1。其实它们在内存中就是同一个对象,通过id查看内存地址:

代码语言:javascript复制
id(x1)
代码语言:javascript复制
4387309696
代码语言:javascript复制
id(y1)
代码语言:javascript复制
4387309696

其实就是同一个python对象贴上了不同的标签而已,但是本质相同

变量互换

代码语言:javascript复制
k, j = 9, 5

上面的变量赋值等价于:

代码语言:javascript复制
k=9
j=5
代码语言:javascript复制
print("k =",k)
print("j =",j)
代码语言:javascript复制
k = 9
j = 5
代码语言:javascript复制
print("id(k): ", id(k))
print("id(j): ", id(j))
代码语言:javascript复制
id(k):  4387308928
id(j):  4387308800

下面我们交换kj两个变量的值:

代码语言:javascript复制
k, j = j, k  # 变量值的交换

上面语句的含义表示为:将变量j的值(已经赋值了5)再赋值给变量k;将变量的值(已经赋值了9)再赋值给变量j;

代码语言:javascript复制
print("k =",k)
print("j =",j)
代码语言:javascript复制
k = 5
j = 9
代码语言:javascript复制
print("id(k): ", id(k))
print("id(j): ", id(j))
代码语言:javascript复制
id(k):  4387308800
id(j):  4387308928

通过对比交换前后两个变量的内存地址,我们发现:内存地址交换了,也就是变量已经发生了交换

在其他编程语言中实现变量值的交换的操作是(假设已经定义了两个变量a和b):

代码语言:javascript复制
temp = a  # a赋值中间变量temp
a = b     # b的值赋给变量a
b = temp  # temp的值赋给变量b

变量的相等和相同

首先,必须声明的是Python中变量的相等和相同,是不同的两个概念,举例子说明

代码语言:javascript复制
number1 = 88
number2 = 88
代码语言:javascript复制
id(number1)
代码语言:javascript复制
4387311456
代码语言:javascript复制
id(number2)
代码语言:javascript复制
4387311456

判断两个变量是否相等:使用==

代码语言:javascript复制
number1 == number2
代码语言:javascript复制
True

判断两个变量是否相同:使用is

代码语言:javascript复制
number1 is number2
代码语言:javascript复制
True

结果都是True,说明number1和number2两个变量就是同一个对象

代码语言:javascript复制
list1 = "hello python"
list2 = "hello python"
代码语言:javascript复制
list1 == list2  # 相等
代码语言:javascript复制
True
代码语言:javascript复制
list1 is list2  # 不相同
代码语言:javascript复制
False

上面的结果表明:list1和list2是相等,但是不相同。

代码语言:javascript复制
id(list1)
代码语言:javascript复制
4444494000
代码语言:javascript复制
id(list2)
代码语言:javascript复制
4444495024

通过查看二者的内存地址发现:它们的地址真的不同,所以肯定是不相同的两个对象。

我们再看最后一个情况:

代码语言:javascript复制
number3 = 1000
number4 = 1000
代码语言:javascript复制
number3 == number4  # 相等
代码语言:javascript复制
True
代码语言:javascript复制
number3 is number4  # 居然不相等啦!
代码语言:javascript复制
False

我们查看下二者的内存地址,发现它们的地址真的不同,所以肯定不是同一个对象啦~

代码语言:javascript复制
id(number3)
代码语言:javascript复制
4444408880
代码语言:javascript复制
id(number4)
代码语言:javascript复制
4444409104

这到底是为什么呢?以后揭晓~

0 人点赞