当前位置: 首页 > news >正文

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. 执行过程
  1. 调用函数 outer()。

  2. 在 outer函数中,变量x 被赋值为 6

  3. 调用嵌套函数 inner()。

  4. 在 inner 函数中,通过 nonlocal x 声明,x 被识别为外层函数 outer 中的变量。

  5. 打印变量x 的值,输出 6

输出结果

6

(温馨提醒:本篇文章属于AI 协助创作)

相关文章:

  • Linux第一节:Linux系统编程入门指南
  • 【参考资料 II】C 运算符大全:算术、关系、赋值、逻辑、条件、指针、符号、成员、按位、混合运算符
  • ctfshow WEB web签到题
  • 五种IO模型
  • 【JavaEE】Mybatis XML配置文件实现增删改查
  • 编程从键盘输入一个大写英文字符,将其转换为小写字符显示并显示出它的十进制,十六的 ASCI码。
  • Kubernetes集群中部署SonarQube服务
  • Gitee上库常用git命令
  • Babel 从入门到精通(四):@babel/template的应用实例与最佳实践
  • 【JavaEE】springMVC返回Http响应
  • 【负载均衡系列】Nginx
  • 【例6.5】活动选择(信息学奥赛一本通-1323)
  • 如何拆解模糊需求管理
  • 【C语言】自定义数据类型:联合体和枚举
  • Java Collection API增强功能系列之二 List.of、Set.of、Map.of
  • 《Python全栈开发》第12课:RESTful API设计 - 构建现代化接口
  • ArrayList<E>案例//定义一个方法,将价格低于3000的手机信息返回
  • 0324-项目
  • 【蓝桥杯速成】| 11.回溯 之 子集问题
  • SpringBoot星之语明星周边产品销售网站设计与实现
  • 东莞“超级”音乐节五一出圈背后:文旅热力何以澎湃经济脉动
  • 上海启动万兆光网试点建设,助力“模速空间”跑出发展加速度
  • 光大华夏:近代中国私立大学遥不可及的梦想
  • 司法部谈民营经济促进法:对违规异地执法问题作出禁止性规定
  • 暴雨及强对流天气黄色预警已发布!南方进入本轮降雨最强时段
  • 咖啡戏剧节举办第五年,上生新所“无店不咖啡,空间皆可戏”