鱼C论坛

 找回密码
 立即注册
查看: 2099|回复: 10

[已解决]第20讲课后作业问题

[复制链接]
发表于 2020-2-9 16:00:30 | 显示全部楼层 |阅读模式

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

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

x
def outside():
    var = 5
    def inside():
        print(var)
        var = 3
        
    inside()
outside()
答案上说是内嵌函数 inside() 也有一个同名的变量将 outside() 的 var 变量屏蔽起来,但是inside()函数内不也赋值成3了,为什么不输出3呢,是因为先执行print语句再执行的var= 3的原因吗
最佳答案
2020-2-9 16:51:57
本帖最后由 wp231957 于 2020-2-9 16:56 编辑
素手就琴 发表于 2020-2-9 16:33
再追加问一个可能比较傻的问题,就是说,如果顺序执行的话,那先执行print还没有执行到var =3的时候,那 ...


是这样的  看这个代码:
  1. def aa():
  2.   var=5
  3.   def bb():
  4.     print(var)
  5.   bb()  


  6. aa()   
复制代码

这个代码可以正常执行   

再看这个代码

  1. def aa():
  2.   var=5
  3.   def bb():
  4.     var=6
  5.     print(var)
  6.   bb()  

  7.   
  8. aa()   
复制代码


这段代码也能执行


再看这个代码
  1. def aa():
  2.   var=5
  3.   def bb():
  4.     print(var)
  5.     var=6
  6.     print(var)
  7.   bb()  

  8.   
  9. aa()   
复制代码


Traceback (most recent call last):
  File "3.py", line 10, in <module>
    aa()
  File "3.py", line 7, in aa
    bb()
  File "3.py", line 4, in bb
    print(var)
UnboundLocalError: local variable 'var' referenced before assignment

为什么这个代码就无法运行了呢:
因为  :
始终要明白一个事情,这3段代码中  外var 和内var  都是两个不同的东东
第三个代码中  存在var这个变量   却是  未赋值,先使用  所以报错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-9 16:12:03 From FishC Mobile | 显示全部楼层
你猜,没有循环的话,不都是顺序执行吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 16:15:07 | 显示全部楼层
应该是这样的。我试着编译了这段代码,报错了,提示local variable 'var' referenced before assignment。因为先执行print了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 16:15:21 | 显示全部楼层
对,Python 程序没有循环、条件之类的是顺序执行的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-9 16:33:36 | 显示全部楼层
wp231957 发表于 2020-2-9 16:12
你猜,没有循环的话,不都是顺序执行吗

再追加问一个可能比较傻的问题,就是说,如果顺序执行的话,那先执行print还没有执行到var =3的时候,那不应该输出5吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 16:51:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 wp231957 于 2020-2-9 16:56 编辑
素手就琴 发表于 2020-2-9 16:33
再追加问一个可能比较傻的问题,就是说,如果顺序执行的话,那先执行print还没有执行到var =3的时候,那 ...


是这样的  看这个代码:
  1. def aa():
  2.   var=5
  3.   def bb():
  4.     print(var)
  5.   bb()  


  6. aa()   
复制代码

这个代码可以正常执行   

再看这个代码

  1. def aa():
  2.   var=5
  3.   def bb():
  4.     var=6
  5.     print(var)
  6.   bb()  

  7.   
  8. aa()   
复制代码


这段代码也能执行


再看这个代码
  1. def aa():
  2.   var=5
  3.   def bb():
  4.     print(var)
  5.     var=6
  6.     print(var)
  7.   bb()  

  8.   
  9. aa()   
复制代码


Traceback (most recent call last):
  File "3.py", line 10, in <module>
    aa()
  File "3.py", line 7, in aa
    bb()
  File "3.py", line 4, in bb
    print(var)
UnboundLocalError: local variable 'var' referenced before assignment

为什么这个代码就无法运行了呢:
因为  :
始终要明白一个事情,这3段代码中  外var 和内var  都是两个不同的东东
第三个代码中  存在var这个变量   却是  未赋值,先使用  所以报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 16:55:58 | 显示全部楼层
本帖最后由 yexing 于 2020-2-9 16:58 编辑

你这个程序有问题,执行会报错:
第二行的 var 被赋值为 5 ,但是此时 var 是一个局部变量,仅作用于函数自身(不作用于内嵌函数)。
所以当你在内嵌函数内 print(var) 会报错,建议在 print(var) 前面加上 nonlocal var ,以正常执行该程序。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-9 17:08:00 | 显示全部楼层
yexing 发表于 2020-2-9 16:55
你这个程序有问题,执行会报错:
第二行的 var 被赋值为 5 ,但是此时 var 是一个局部变量,仅作用于函数 ...

def outside():
    var = 5
    def inside():
        print(var)
      
        
    inside()
outside()
这样写也是可以执行的丫
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 17:09:13 | 显示全部楼层
素手就琴 发表于 2020-2-9 17:08
def outside():
    var = 5
    def inside():

可以的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-9 17:09:18 | 显示全部楼层
wp231957 发表于 2020-2-9 16:51
是这样的  看这个代码:

这个代码可以正常执行   

那既然第一段代码外var和内var是两个东东,那在print(var)前,也没赋值丫
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 17:35:40 From FishC Mobile | 显示全部楼层
素手就琴 发表于 2020-2-9 17:09
那既然第一段代码外var和内var是两个东东,那在print(var)前,也没赋值丫

你搜一下变量作用域  for python
本部它没找到,它会找嵌套域
而另一个例子,本部找到了,它就不会去理会嵌套域???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-3 18:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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