m0_72318130 2022-08-28 23:40 采纳率: 75%
浏览 25
已结题

python函数问题

第一种情况
def nb():
a+=1
print(a)
a=2
nb()
显示为错误

第二种情况
def nb():
global a
a+=1
print(a)
a=2
nb()
》》3

为什么第一种情况是错的呀

  • 写回答

5条回答 默认 最新

  • starlight_2007 2022-08-29 00:05
    关注

    因为a这个变量在nb()函数中不作为参数出现,而作为局部变量出现。
    此时,无论是否存在全局变量a,只要nb()函数内部对未在函数内定义的变量a进行操作,python都会报错“UnboundLocalError: local variable 'a' referenced before assignment”。

    而您第二次定义nb()函数时,在对变量a进行操作前进行声明,令解释器知道接下来函数内部操作的变量a是全局变量,就不会报错。
    简单来说,在python里每一次定义函数,都类似于创建一个继承父环境部分特性的子环境,但它们使用的是两套变量:在大环境里定义的变量被称为全局变量,它适用于大环境里的所有对应函数,但想要通过函数来调用变量,要在使用前在函数中声明将调用的变量是来自大环境里的全局变量,而不是只适用于本函数的局部变量。而在函数内部定义的变量是局部变量,只适用于函数内部使用。
    要想跨环境调用变量,有两种办法:
    (1)声明:global/nonlocal
    (2)将变量作为参数代入函数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 9月12日
  • 已采纳回答 9月4日
  • 创建了问题 8月28日

悬赏问题

  • ¥15 哪位能做百度地图导航触点播报?
  • ¥15 请问GPT语言模型怎么训练?
  • ¥15 已知平面坐标系(非直角坐标系)内三个点的坐标,反求两坐标轴的夹角
  • ¥15 webots有问题,无响应
  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
  • ¥15 大智慧怎么编写一个选股程序
  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证