鱼C论坛

 找回密码
 立即注册
查看: 3590|回复: 5

[已解决]只是多了一个print语句,咋就报错了呢?

[复制链接]
发表于 2023-6-25 21:48:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码1:
  1. >>> x = 880
  2. >>> def myfunc():
  3.         x = 520
  4.         print(x)

  5.        
  6. >>> myfunc()
  7. 520
复制代码


代码2:
  1. >>> def myfunc():
  2.         print(x)
  3.         x = 520
  4.         print(x)

  5.        
  6. >>> myfunc()
  7. Traceback (most recent call last):
  8.   File "<pyshell#13>", line 1, in <module>
  9.     myfunc()
  10.   File "<pyshell#12>", line 2, in myfunc
  11.     print(x)
  12. UnboundLocalError: local variable 'x' referenced before assignment
复制代码


代码2 相比 代码1 ,只是多了一个print(x)语句, 咋就报错了呢? 感觉是变量作用域的问题,但是不知道错在哪里了, 请老师指点。
最佳答案
2023-6-26 14:19:25
wbzxz 发表于 2023-6-26 14:16
非常感谢您的指点。
您看我能不能这样理解,其实这个问题的关键时由于我使用了赋值语句,所以造成python ...

你的理解是正确的!在函数中,只要我们对一个变量进行赋值操作,无论这个赋值操作在哪里,Python 都会认为这个变量是局部的,除非你明确地用  global  或  nonlocal  声明它。如果在赋值之前就试图访问这个变量,就会遇到  UnboundLocalError  错误。

这是因为在编译函数的时候,Python 会决定变量是全局的还是局部的。在函数体中,任何在赋值语句( = )左侧的变量,都会被认为是局部变量,除非明确地声明为全局变量或非局部变量。

对于你的第二个问题,其实不仅仅是赋值语句会引起这个问题,任何试图修改一个变量的操作都会让 Python 将这个变量视为局部的,如果没有明确声明它是全局的。例如:

  1. x = 880

  2. def myfunc():
  3.     x += 1    # This is effectively an assignment operation
  4.     print(x)

  5. myfunc()
复制代码


这段代码也会抛出  UnboundLocalError  错误,因为  x += 1  本质上是  x = x + 1 ,是一种赋值操作。Python 认为  x  是局部的,但是在赋值之前已经引用了  x ,导致错误。

所以总的来说,只要在函数内部修改变量的值,如果不想让 Python 将其视为局部变量,就需要使用  global  或  nonlocal  关键字明确声明。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-26 06:07:37 | 显示全部楼层
isdkz 发表于 2023-6-25 22:14
这个错误确实是因为变量作用域的问题。

在 Python 中,当你在函数内部对一个变量进行赋值操作的时候,这 ...

谢谢您,但是我还没有理解透彻。

您的意思是不是说,出错的原因,是局部变量x没有定义就要求打印,所以才报错。但是为什么下面的代码不会出错呢?(代码中变量x没有被定义,也是直接打印x)

  1. >>> x = 880
  2. >>> def myfunc():
  3.         print(x)

  4.        
  5. >>> myfunc()
  6. 880
复制代码


谢谢您,请多指点。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-26 14:16:38 | 显示全部楼层
isdkz 发表于 2023-6-26 08:49
当你在一个函数内部引用一个变量,Python 会按照以下顺序来查找这个变量:

1. 首先,它会在当前函数 ...

非常感谢您的指点。
您看我能不能这样理解,其实这个问题的关键时由于我使用了赋值语句,所以造成python以为 myfunc 函数中x变量一定是局部变量,不会按照LEGB规则进行查找啦。而在x变量赋值之前,使用了print(x)语句,python就认为没有复制就引用啦,所以出现错误啦。

而在代码一中,虽然也使用了赋值语句,python也认为函数内部的x变量是局部变量。由于没有在赋值前访问x变量,而是先给变量赋了值,这样就不会出错啦。

您看我这样理解对不,但我的描述肯定不准确,除了赋值语句会引起这个问题, 还有什么语句会引起类似错误呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-25 03:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表