说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
变量是保存存储值的内存位置。也就是说,当创建一个变量时,可以在内存中保留一些空间。Python 中的「变量」与 C、C++、Java 等语言不同,其实不是真正的变量,如果要加以区分应该称为标识符,不过大家已经习惯称它为变量。
基于变量的数据类型,解释器分配内存并决定可以存储在保留的存储器中的内容。 因此,通过为变量分配不同的数据类型,可以在这些变量中存储的数据类型为整数,小数或字符等等。
变量可以理解为一个存放内容的固定的地方,比如宾馆的 888 号房间,每天会住不同的人,但这个容身之所不变。比如一个篮子,里边可以放水果,也可以装糕点,当然也可以装现金(注意安全),Python 就是这样,变量一旦建立你可以放任何东西,它都能接受,不需要事先申明我将要放什么。
学习提示
=
等号在 python 中是赋值运算,真正数学中的相等是 ==
如:
year = 2022
意思是 year 是一个变量,存储内容的标识,将 2020 这个值放进去(但实际上是内存中的对象 2022 给定一个标识符号 year)。age = year - 1996
意思是 age 是一个变量, 具体值是通过 year 里的值减去 1996 计算出来的注:以上是比较简单的理解方式,真正的变量逻辑可能有一点复杂,可随着学习的深入再进行了解。
命名规则如下:
提示
系统关键词量有限,很快就会记住的啦。
Python 关键字查看方法:
import keyword
keyword.kwlist
False, None, True, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield
详见:Python 关键字 。
以下是合法的变量名,并且是不同的变量:
age
age_18
Xiaoming_age
年龄
Age
AGE
_age
_age_
__age__
某A
π
Δ
不合法的变量命名:
name-1 # 有连字符
my name # 有空格
3renxing # 数字开头
tell.me # 有点号,它是Python的一个操作
class # Python关键字
[name] # 有方括号
关键字、内置函数、库的常量、方法名等,不要做变量名,无论大小写,有需要的话应该在后边加一个下划线,如 len_
、bool_
。还可以使用关键词相似(或者是读音、其他语言派生等)的单词代替,如 class 用 klass。还可以用 foo、bar 等做不特定对象的命名。
是否是一个合法的变量名可以用以下方法判断:
'某A'.isidentifier()
# True
特殊地,_
也是一个变量名,如果你不定义它,它一直会取上一个执行完的值,它会指向你最后一次执行的表达式。也可用来来表示某个变量是临时的或无关紧要的。Python 会自动将解释器中最后一个表达式的值存储到一个名为 _
的特定变量中,如果需要,还可以将这些值指定给另一个变量。
a = 8
_ # 8
c = _
c
# 8
比如再放循环中,当你懒得定义变量名时可以用它。可以把它理解成变量的变量名。
# 打印 10 次
>>> for _ in range(10):
... print('Hello, World.')
可以在拆包中占位,但不使用这个占位上的数据:
>>> car = ('red', 'auto', 12, 3812.4)
>>> color, _, _, mileage = car
>>> color
'red'
>>> mileage
3812.4
>>> _
12
可以认为它是一个一次性的变量,只用一次,仅用于临时数据的传递,以后不会再用。
更详细的介绍可以参考 单下划线变量 中的介绍。
上边说了,变量不需要事先声明就直接赋值,Python 会自动创建变量,那赋值过程会很简单高效。
nvshen = 'lily' # 自动创建变量并赋值
nvshen = 'lucy' # 此时变量的值已经发生了变化, 可打印出来看看
查看变量的类型:
type(nvshen) # 查看变量的类型, 返回 str, 代表是个文本
# str
nvshen = 666 # 此时变量的类型发生了变化
type(nvshen) # 返回类型为数字
# int
我们可以用表达式进行赋值:
birth_year = 1996
age = 2020 - birth_year # 此时会将计算结果进行赋值
age = age + 1 # 同上
age += 1 # 上一行的简写,也有 -= 1
this_year = birth_year + age # 变量计算后将结果赋值
批量赋值:
# 这里涉及的元组和列表后边会讲到
lily_age, lucy_age, tom_age = (18, 19, 20) # 可以打印出来看看三个变量的结果
a, b, c = ['hi']*3 # 三个同样的值
a = b = c = 'hi'
运算赋值,可以通过布尔运算或者逻辑运算进行赋值,在相关知道不清楚时先跳过,后边也会提到:
# 布尔运算赋值
x = a or b # 哪个为真就就将值赋值到 x
x = a and b # 哪个为假就将值赋到 x
# 条件循环计算赋值
x = a if a > b else b # 如果 a>b 那知 x = a, 否则 x = b
x = [i for i in a] # 将可迭代的 a 生成一个列表赋值给 x
海象运算符 :=
(因为它很像海象的眼睛和长牙)是 python 3.8 开始支持的新方法。它用于在表达式内部赋值避免计算代码重复写几次,例如:
n = '9'
if long:=int(n) < 10:
print(long+1)
# 10
long
# 9
更多内容可以查看:Python 赋值表达式(海象运算符)。
变量有范围之说,一个函数中的变量只能在函数中使用,这块儿不明白可以学了函数后再来看。
text = '爱'
def say():
text = '博爱'
print(text)
# 执行函数返回
say() # 博爱
text # 爱
但想让函数里边的 text
成为全局的变量,需要加 global
关键字:
text = '爱'
def say():
global text
text = '博爱'
print(text)
# 现在执行变量
text # 博爱
nonlocal 语句会使得所列出的名称指向之前在最近的包含作用域中绑定的除全局变量以外的变量。 这种功能很重要,因为绑定的默认行为是先搜索局部命名空间。 这个语句允许被封装的代码重新绑定局部作用域以外且非全局(模块)作用域当中的变量。
与 global 语句中列出的名称不同,nonlocal 语句中列出的名称必须指向之前存在于包含作用域之中的绑定(在这个应当用来创建新绑定的作用域不能被无歧义地确定)。
nonlocal 语句中列出的名称不得与之前存在于局部作用域中的绑定相冲突。
i = 0
def a():
i = 1
def b():
nonlocal i
i = 2
b()
print(i)
a()
# 2
在多重嵌套中,nonlocal 只会上溯一层; 而如果上一层没有,则会继续上溯(如上方代码没有 i=2 时,会往上一层找到 i=1,最终输出 1 )。
简单地总结:
LEGB规则,在作用域中按名称去寻找对象(Python中一切皆对象)时,会按照 LEGB 规则去查找。 如果发生重名,也会按照LEGB规则,谁先被找到就用谁。
所谓LEGB规则,很简单,就是作用域查找顺序为:
Local -> Enclosing -> Global -> Built-in
len = len([]) # (1) 0 Global ,内置函数 Built-in len
def a():
len = 1 # (2) 1
def b(): # Enclosing
len = 2 # (3) 2 Local
print(len) # (4)
b()
a()
# = 2
!!! note "不怪你"
以下内容是高级内容,初学者可能看不懂,跳过就行。
Python标识符是用户定义的名称,用于表示变量、函数、类、模块或任何其他对象。如果在 Python 中为一个可编程实体指定了某个名称,那么它在技术上只是一个标识符。在 Python 中,标识符是一个最大和最正规的概念,标识符号包括变量的名称、函数名、类名、方法名、包名等等,它们的命名规则都是一样的。
规则与原则:
['.'、'!'、'@'、'#'、'$'、'%']
,这些符号是禁止的。最佳实践:
_
作为其第一个字符来声明私有标识符。_
同时作为前导和尾随字符。因为 Python 内置类型已经使用了这种表示法。Python 中的一个变量表示一个实体,其值可以根据需要进行更改。从概念上讲,它是一个存储实际值的内存位置。我们可以通过查询实体从代码中检索值。
但它需要为该内存位置指定一个标签,以便我们可以引用它。在编程术语中,我们称之为变量。以下是关于Python变量的一些关键事实,这些将帮助程序员有效地使用它们。
test = 10
表达将导致以下行为:# 图1
| ~~~~~ | ----- ~~~~~~~~~ ------- ****
( test ) ----- Reference ------- ** 10 **
| ~~~~~ | ----- ~~~~~~~~~ ------- ****
Variable ----- ~~~~~~~~~~ ------- Object
# 代码 2
>>> test = 10
>>> id(test)
1716585200
>>> test = 11
>>> id(test)
1716585232
此外,为了性能优化,Python 构建了一个缓存,并重用了一些不可变的对象,比如小整数和字符串。
一个对象只是一个存储以下内容的内存区域:
有类型的是对象,而不是变量。但是,变量可以在需要时保存不同类型的对象。见代码 3
# 代码 3
test = 10
type(test)
# <class 'int'>
test = 'techbeamers'
type(test)
# <class 'str'>
test = {'Python', 'C', 'C++'}
type(test)
# <class 'set'>
if __name__ == '__mian__'
的意义,详见。
更新时间:2024-05-07 10:46:38 标签:python 变量