python中的变量 - 第一章
一、变量的定义
(一)概念
变量是程序中用于存储数据的容器。它有一个名称(标识符)和一个值。变量的名称用于在程序中引用它,而值则是变量存储的实际数据。
(二)动态类型
Python 是一种动态类型语言,这意味着变量的类型是由其存储的值决定的,而不是在变量声明时指定的。同一个变量可以在程序运行过程中被赋予不同类型的数据。
案例1
Python 的动态类型特性
-
Python 是一种动态类型语言,变量的类型是由其当前的值决定的。变量可以在程序运行过程中被重新赋值为不同类型的值,而不需要显式声明类型。
-
这与静态类型语言(如 C 或 Java)不同,静态类型语言要求在变量声明时明确指定类型,并且变量的类型在运行时不能改变。
小结
这段代码演示了 Python 中变量的动态类型特性,即同一个变量可以在程序运行过程中被赋予不同类型的数据,并且每次赋值后,变量的类型会根据其当前值而改变。这种特性使得 Python 在编写代码时更加灵活,但也需要开发者注意变量类型的正确性,以避免类型错误。
二、变量的创建和赋值
(一)创建变量
在 Python 中,变量的创建是通过赋值语句完成的。赋值语句的基本形式是:
variable_name = value
其中,variable_name 是变量的名称(标识符),value 是要存储的值。
案例
(二)赋值操作
Python 支持多种赋值操作,包括单个赋值、多重赋值和链式赋值。
单个赋值:
x = 10
多重赋值:
可以同时为多个变量赋值。
a, b, c = 1, 2, 3
print(a, b, c) # 输出:1 2 3
链式赋值:
同一个值可以赋给多个变量。
x = y = z = 10
print(x, y, z) # 输出:10 10 10
(三)增强赋值运算符
Python 提供了一些增强的赋值运算符,用于在赋值的同时进行运算。
x = 10
x += 5 # 等价于 x = x + 5
print(x) # 输出:15
三、变量的作用域
变量的作用域决定了变量在程序中的可见性和生命周期。Python 中的变量作用域主要包括以下几种:
(一)局部变量(Local Variables)
局部变量是在函数内部定义的变量。它们只能在定义它们的函数内部访问,函数外部无法访问。局部变量的生命周期从函数调用开始,到函数返回结束。
案例1 - print(ab) 写在func() 之后
变量 ab 是在函数 func 内部定义的,它是一个 局部变量,只在函数内部有效。当函数执行完毕后,局部变量 ab 的作用域结束,它在函数外部是不可见的。所以 print(ab) 的输出结果:NameError: name 'ab' is not defined
案例2 - print(ab) 写在func() 之前
-
这行代码试图在函数外部访问变量 ab。
-
问题:在执行这行代码时,ab 还没有被定义。它是在函数 func 内部定义的局部变量,而此时函数 func 还没有被调用。
-
结果:Python 报错 NameError: name 'ab' is not defined,因为它在当前作用域(全局作用域)中找不到变量 ab。
关键点:代码执行顺序和作用域
-
代码执行顺序:Python 是按代码的顺序执行的。在执行print(ab) 时,函数func 还没有被调用,因此变量ab 还没有被定义。
-
作用域:变量 ab 是局部变量,只在函数 func 内部有效。即使在函数调用之后,它也无法在函数外部被访问。
(二)全局变量(Global Variables)
全局变量是在函数外部定义的变量。它们可以在整个程序中访问,包括函数内部。如果需要在函数内部修改全局变量,需要使用 global 关键字。
案例 1 - 错误示范
问题原因
-
Python 的作用域规则:当在函数内部对一个变量进行赋值操作时,Python 会将该变量视为局部变量,除非明确声明它是全局变量。
-
在函数 func 中,对变量a 进行了赋值操作(a = 30),因此 Python 认为a 是一个局部变量。
-
引用局部变量之前未赋值:在函数内部,print(a) 试图访问局部变量 a,但此时a还没有被赋值(因为赋值操作在print(a) 之后)。因此,Python 抛出 UnboundLocalError 错误。
案例2 - 错误示范
-
在函数内部,如果要使用 global 关键字声明一个变量为全局变量,那么这个声明必须在函数内部的任何引用或赋值操作之前。
-
在你的代码中,print(a) 出现在 global a 声明之前,因此 Python 抛出了SyntaxError。
正确的代码
要解决这个问题,必须将 global 声明放在函数内部的最前面,确保在任何引用或赋值操作之前声明变量为全局变量。
修改后的代码
a = 20
def func():
global a # 先声明 a 是全局变量
print(a) # 然后访问全局变量 a
a = 30 # 修改全局变量 a
print(a) # 再次打印全局变量 a
func()
print(a) # 在函数外部打印全局变量 a 的值
(三)非局部变量(Nonlocal Variables)
非局部变量是在嵌套函数中定义的变量。它们既不是全局变量,也不是局部变量。如果需要在嵌套函数中修改非局部变量,需要使用 nonlocal 关键字。
案例1
代码分析
1. 外层函数 outer
-
定义了一个变量 x,其值为
6
。 -
定义了一个嵌套函数 inner。
2. 内层函数 inner
-
使用 nonlocal x 声明变量x 是非局部变量。这告诉 Python,x是外层函数 outer 中定义的变量,而不是局部变量。
-
打印变量x 的值。
3. 调用内层函数 inner
-
在外层函数 outer 中调用内层函数 inner。
4. 执行过程
-
调用函数 outer()。
-
在 outer函数中,变量x 被赋值为
6
。 -
调用嵌套函数 inner()。
-
在 inner 函数中,通过 nonlocal x 声明,x 被识别为外层函数 outer 中的变量。
-
打印变量x 的值,输出
6
。
输出结果
6
(温馨提醒:本篇文章属于AI 协助创作)