Shebang 的使用
- #!被称为Shebang 或者 Sha-bang,是python的脚本解释程序
- 通常在unix系统脚本中的第一行使用
- 指明这个脚本文件的解释程序
使用 #!
- which 命令查询 python解释器
which python3
- 在要执行的python脚本第一行加入Shebang
#! /usr/bin/python3
- 修改文件权限
chmod +x xxx.python
- 执行脚本文件
./xxx.py
变量进阶
变量的引用
- 变量和数据都是保存在内存中的
- 在python中,函数的参数传递及返回值都是靠引用传递的
引用的概念
在python中
- 变量 和数据 分开存储在内存中
- 数据保存在划分内存的某一个有具体地址的位置
- 变量中保存着数据的具体地址
- 变量记录数据的地址,叫做引用
- 使用 id()方法可以查看变量保存数据所在的内存地址
给变量赋值的操作,本质上就是改变了变量的引用值
i = 1
# 内存中存储1,并将其地址赋值给i变量
a = i
# 将i的引用值赋值给 a, 此时,a记录了1的地址
函数的实参和返回值的传递
- 在python中,函数的实参和返回值都是靠引用来传递的
def test(num):
print (‘%d 在内存中的地址是 %x’ %(num,id(num))
result = 100
print (‘返回值 %d 在内存中的地址是 %x’%(result,id(result))
return result
a = 10
print (‘调用前,参数a的地址是 %x' %id(a))
# 调用函数时,本质上是传递实际参数的地址,而不是实际参数的值
result = test(a)
# 如果test(a)不定义变量,则不会拿到返回值,
print (‘调用后,参数a的地址是 %x' %id(a))
print (‘调用后,返回值result的地址是 %x' %id(result))
可变和不可变类型
不可变类型
内存中的数据不允许被修改
- 数字类型
- int
- float
- bool
- complex
- long (python2.x)
- 元组
- 字符串
可变类型
内存中的数据允许被修改
- 列表 list
- 字典 dict
Tips:
- 可变类型的数据变化,是通过方法来实现的
- 如果给一个可变类型的变量,赋值了一个新的数据,引用会随之发生改变
- 变量不再对之前的数据引用
- 变量改为对新赋值的数据引用
arr = [1,2,3]
id(a) # *****38312
arr.append(999)
print(a) # [1,2,3,999]
id(a) # *****38312
a.remove(2)
id(a) # *****38312
a.clear()
id(a) # *****38312
a = []
id(a) #*****09832
字典的key只能是不可变类型
哈希 hash
python 中有一个内置函数 hash(o)
- 接收一个 不可变类型 作为参数
- 返回的结果是一个整数
hash算法用于提起数据的特征码(指纹)
- 相同的内容得到相同的结果
- 不同的内容得到不同的结果
hash算法在python中的应用
在python中,设置字典的 <k,v>时,会首先对key进行hash,决定如何在内存中保存字典的数据,方便对字典的增删改查。
- 所以字典的key必须是不可变的
- 字典的value可以是任意的
局部变量和全局变量
- 局部变量定义在函数内部,只能在函数内部使用
- 全局变量定义在函数外部,被所有可访问的函数共享使用
局部变量
- 局部变量在函数内部定义,只能在函数内部使用
- 局部变量在代码执行完毕后,会被系统回收
- 不同的函数,可以定义相同名称的局部变量,互不影响
局部变量的作用
- 在函数内部使用时,临时保存
def demo1():
a = 10 # 定义一个局部变量
print(‘%d’ %num)
demo1()
# print(‘%d’ %num) #会报错 name ‘num’ is not define
局部变量的生命周期
- 生命周期就是被创建到被回收的过程
- 局部变量在函数被执行时,才会被创建
- 函数执行结束后,局部变量被系统回收
- 局部变量在其生命周期内,可以临时存储函数内部需要使用的数据
全局变量
- 全局变量在函数外部定义,所有的函数都可以使用这个变量
num = 10
def demo1():
print(num)
def demo2():
print(num)
demo1()
demo2()
注意:
函数执行过程中,需要处理变量时:
- 首先查找函数内部是否存在指定名称的局部变量,如果有,直接使用
- 如果没有,查找程序外部指定名称的全局变量,如果有,直接使用
- 未找到时报错
函数不能直接修改全局变量的引用
- 在函数内部,使用全局变量的引用获取对应的数据
- 不允许直接修改全局变量的引用,使用赋值语句修改全局变量的值
- 如果直接修改全局变量的引用,会在函数内部,定义一个局部变量
num = 10
def demo1():
# 希望修改python变量的值
num = 99
print(num)
def demo2():
print(num)
demo1() # 输出 99
demo2() # 输出 10
使用global修改全局变量的值
- global 关键字会告诉解释器,后面的变量是一个全局变量,再使用赋值语句时,就不会创建局部变量
num = 10
def demo1():
# 希望修改python变量的值
global num
num = 99
print(num)
def demo2():
print(num)
demo1() # 输出 99
demo2() # 输出 99
定义全局变量的位置
为了方便函数使用全局变量,需要将全局变量定义在模块上方,避免出现name ‘xxx’ is not define
代码结构示意图
Shebang
import 模块
全局变量
函数定义
执行代码
全局变量命名的建议
- 为了避免全局变量和局部变量出现混淆,在定义全局变量时,建议增加g_或者gl_的前缀