1、Python变量
变量的定义:
可以看成一个小箱子,专门用来“盛装”程序中的数据。每个变量都拥有独一无二的名字,通过变量的名字就能找到变量中的数据。
2.变量的赋值
Python 使用等号=作为赋值运算符,具体格式如下:
name = value
#name为变量名 =为赋值符号 value为变量值
3.变量的引用
变量 和 数据 都是保存在 内存 中的
在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的
3.1 引用的概念
在Python中:
变量与数据分开存储
数据保存在内存的某个位置
变量中存放的是数据在内存中的地址
变量中存放数据的内存地址,就是引用
使用id()可以查看变量中保存的数据的内存地址。
#关于变量的多次赋值(不可变类型)
a = 1a= 2
‘‘‘首先:a = 1 ,在内存中为1开辟一个空间,将1存进去,a中保存着1的内存地址
然后 a = 2,在内存中为2开辟一个空间,将2存进去,a中保存着2的内存地址
总结:在python中队同一个变量的多次赋值,并不是在同一个内存空间中刷新其中存放的值,而是将变量中存放的地址进行更新,使其指向不同的地址空间(数据)。‘‘‘
#变量引用的例子
a = 1
b = 2
c = a #将存在a中的地址赋值给c,现在c也指向了值为1的内存地址
id(a)
id(c)#使用id()查看变量中存放的内存地址 与a一致
3.2 ==和is
==用来比较变量所指向的内存中的值是否相等
is用于判断两个变量引用对象(存放的对象的值)是否为同一个,对象就是=右边那个值,is比较的是两个变量中存放的内存地址是否相同。
#==和is的区别
a = [1, 2, 3]b =ab == a #True
b is a #True
c = a[:] #复制列表,在内存中另外存放这段被复制的值,将c指向它
b is a #True
b == a #False
#为什么相同的值内存地址不同呢?
3.3 函数的参数和返回值的传递
在 Python 中,函数的 实参/返回值 都是是靠 引用 来传递来的
#Python中函数参数是引用传递(注意不是值传递)
deftest(num):print("-" * 50)print("%d 在函数内的内存地址是 %x" %(num, id(num)))
result= 100
print("返回值 %d 在内存中的地址是 %x" %(result, id(result)))print("-" * 50)returnresult
a= 10
print("调用函数前 内存地址是 %x" %id(a))
r=test(a)print("调用函数后 实参内存地址是 %x" %id(a))print("调用函数后 返回值内存地址是 %x" % id(r))
4.变量的可变类型和不可变类型
不可变:内存中存放的数据不允许被修改
数据类型:int, bool, float, complex
字符串:str (用单引号或者双引号包含字符串)
元组:tuple(用()包含元组)
可变:内存中的数据可以被改变
列表:list(用[]包含)
字典:dict(用{}包含)
集合:set(可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用set() 而不是 { },因为 { } 是用来创建一个空字典。)
总结:
可变类型:变量在第一次被定义的时候就固定分配了内存地址,变量中的内存地址不会随着值的改变而改变。
不可变类型:给同一个变量多次赋值,变量中的地址会随着值的改变指向新的内存地址。
#不可变类型
x = 18id(x)
prinnt(x)#值为18
x+= x #值为19
id(x) #id改变
print(x) #值为19
#可变类型
y = [1,2,3]
id(y)print(y)
y.append(4)
id(y)#内存地址不变
print(y)#值改变
5.小整数池
python中经经常使用的一些数值定义为小整数池,小整数池的范围是[-5,256],python对这些数值已经提前创建好了内存空间,即使多次重新定义也不会在重新开辟新的空间,但是小整数池外的数值在重新定义时都会再次开辟新的空间。
小整数池目的:节省内存,提高执行效率。
需要注意的是:Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被垃圾回收机制回收。
a=5b=5ais b #True
a=1000b=1000ais b #False
原文:https://www.cnblogs.com/betterbetter/p/14323043.html