Python 变量
定义
- 变量的定义不使用关键字
- 变量名使用小写蛇形命名 ( snake_case )
- 变量定义时必须赋值
- 变量并且必须先定义后使用,否则报错
NameError
普通变量
py
变量 = 值
py
# 同时赋值相同的值
变量1 = 变量2 = 变量3 = 值
# 同时赋值不同的值
变量1, 变量2 = 值1, 值2
变量1, 变量2 = ( 值1, 值2 )
例子:实现变量值交换 ( 通过元组解包 )
py
a, b, c = 1, 2, 3
a, b, c = c, b, a
print(a, b, c) # 3 2 1
常量
Python 没有强制常量的概念,常量实质是一个约定为不应被修改的变量
常量名约定使用大写蛇形命名 ( SNAKE_CASE )
py
ALLOWED_HOSTS = ["www.example1.com", "www.example2.com"]
DEBUG = False
临时变量
临时变量用于存储不使用的值,可避免变量未使用的解析器报错
约定使用单下划线_
命名
py
_ = 值
py
a, _, b = ("A", "B", "C")
print(a, b) # "A" "C"
受保护变量
受保护变量多用于在类中表示一个不应该被外部访问的、仅供当前类与其子类使用的属性
约定在名字前面加上前缀单下划线_
受保护变量 vs 类私有成员
- 受保护变量 (
_成员
) 仅作为一种约定,表示不建议直接使用但仍然可以访问 - 类私有成员 (
__成员
) 会改写属性名使其在外部无法直接访问,但可通过实例._类名__属性名
访问到
py
class A:
def __init__(self):
self._成员 = 1
self.__成员 = 2
a = A()
print(a._成员) # 1
print(a.__成员) # AttributeError
print(a._A__成员) # 2
解构赋值
py
字符1位置的变量, 字符1位置的变量 = 字符串
元素1位置的变量, 元素2位置的变量 = 元组
元素1位置的变量, 元素2位置的变量 = 列表
例子:对字符串、元组、列表进行解构赋值
py
a, b, c = "123"
print(a, b, c) # 1 2 3
py
a, b, c = (1, 2, 3)
print(a, b, c) # 1 2 3
py
a, b, c = [1, 2, 3]
print(a, b, c) # 1 2 3
实参解构
py
def 函数(形参1, 形参2):
pass
函数(**字典)
函数(*列表)
例子:验证调用函数传参时将整个字典、列表解包
如下:
py
def my_func(a, b, c):
print(a, b, c)
# 字典
d = {"a": 1, "b": 2, "c": 3}
my_func(**d) # 1 2 3
# 列表
l = [1, 2, 3]
my_func(*l) # 1 2 3
# 字符串
s = "123"
my_func(*s) # 1 2 3
变量作用域
Scope
作用域是指变量的可访问范围,变量根据其在定义时所处位置决定其所属的作用域
py
变量 = 值 # 全局变量
def 函数():
变量 = 值 # 局部变量
全局作用域
Global Scope
全局作用域范围是在函数外部的整个程序中
定义在全局作用域中的变量被称为全局变量 ( Global Variable )
局部作用域
Local Scope
全局作用域范围是在某个函数的内部
定义在局部作用域中的变量被称为 局部变量 ( Local Variable )
局部变量仅在当前作用域内有效,无法被外部直接访问,也无法直接影响到外部的同名全局变量
py
变量 = 值 # 全局变量
def 函数():
变量 = 值 # 局部变量不关联全局变量
局部变量前加上关键字global
后便可与全局作用域中的同名变量相关联,但容易产生全局污染
py
def 函数():
global 变量 # 局部变量关联了全局变量
变量 = 新值
例子:验证global
关键字对函数内的局部变量与同名的全局变量之间的影响
py
num = 100
def fun1():
num = 200
print(num)
def fun2():
global num
num = 200
print(num)
print(num) # 100
fun1() # 200
print(num) # 100
fun2() # 200
print(num) # 200