鱼C论坛

 找回密码
 立即注册
查看: 2096|回复: 4

[已解决]关于变量引用的问题,求解答

[复制链接]
发表于 2017-3-10 11:06:48 | 显示全部楼层 |阅读模式

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

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

x
今天在论坛看到汉诺塔递归的问题,就试着写了一个,但是在想把步数加进去时,变量引用出错。其实这个问题一直也困扰着我,就是我在函数里面使用外部的变量,究竟应该怎么定义,使用global全局关键字还是提示错误。求解答啊
  1. def move(n,from1,to1):
  2.     i += 1
  3.     print('第%d步将%d号盘子从%s移动到%s'%(i,n,from1,to1))
  4. def hanoi(n,from1,middle,to1):
  5.     if(n==1):
  6.         move(1,from1,to1)
  7.     else:
  8.         hanoi(n-1,from1,to1,middle)
  9.         move(n,from1,to1)
  10.         hanoi(n-1,middle,from1,to1)


  11. global i
  12. n = int(input('请输入碟子个数:'))
  13. x = 'A'
  14. y = 'B'
  15. z ='C'
  16. hanoi(n,x,y,z)
复制代码


然后报错就是提示这个i在使用时没有定义。如下:
  1. UnboundLocalError: local variable 'i' referenced before assignment
复制代码


然后我把i定义到hanoi()这个函数中还是不行。求指点
最佳答案
2017-3-10 13:24:24
不废话,先上代码:
  1. def move(n,from1,to1):
  2.     global i
  3.     i += 1
  4.     print('第%d步将%d号盘子从%s移动到%s'%(i,n,from1,to1))
  5. def hanoi(n,from1,middle,to1):
  6.     if(n==1):
  7.         move(1,from1,to1)
  8.     else:
  9.         hanoi(n-1,from1,to1,middle)
  10.         move(n,from1,to1)
  11.         hanoi(n-1,middle,from1,to1)

  12. i = 0
  13. n = int(input('请输入碟子个数:'))
  14. x = 'A'
  15. y = 'B'
  16. z ='C'
  17. hanoi(n,x,y,z)
复制代码



是这样子的:如果你坚持要在函数中使用全局变量,首先你要先定义全局变量,然后在函数中你想修改这个全局变量,你可以使用关键字global,这表示你要让函数中和全局变量同名的局部变量变成全局变量(这可能说得比较难懂),也就是说,关键字global的作用就是让函数中的局部变量变成全局变量(前提是你这个局部变量和全局变量同名)。

您主要的问题是:1、你不清楚关键字global的作用,2、i 变量没有定义赋值   
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-3-10 11:14:00 | 显示全部楼层
在需要使用到i的地方加上global i的声明就可以了
你主要出问题是在move函数中的i += 1 你在函数中没有对i定义赋值就直接使用了,全局变量要加上声明的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-10 13:24:24 | 显示全部楼层    本楼为最佳答案   
不废话,先上代码:
  1. def move(n,from1,to1):
  2.     global i
  3.     i += 1
  4.     print('第%d步将%d号盘子从%s移动到%s'%(i,n,from1,to1))
  5. def hanoi(n,from1,middle,to1):
  6.     if(n==1):
  7.         move(1,from1,to1)
  8.     else:
  9.         hanoi(n-1,from1,to1,middle)
  10.         move(n,from1,to1)
  11.         hanoi(n-1,middle,from1,to1)

  12. i = 0
  13. n = int(input('请输入碟子个数:'))
  14. x = 'A'
  15. y = 'B'
  16. z ='C'
  17. hanoi(n,x,y,z)
复制代码



是这样子的:如果你坚持要在函数中使用全局变量,首先你要先定义全局变量,然后在函数中你想修改这个全局变量,你可以使用关键字global,这表示你要让函数中和全局变量同名的局部变量变成全局变量(这可能说得比较难懂),也就是说,关键字global的作用就是让函数中的局部变量变成全局变量(前提是你这个局部变量和全局变量同名)。

您主要的问题是:1、你不清楚关键字global的作用,2、i 变量没有定义赋值   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-10 14:22:19 | 显示全部楼层
若余相思 发表于 2017-3-10 13:24
不废话,先上代码:

嗯~看到你回复,懂了global的意思了。三科丝
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-10 14:23:15 | 显示全部楼层
lumber2388779 发表于 2017-3-10 11:14
在需要使用到i的地方加上global i的声明就可以了
你主要出问题是在move函数中的i += 1 你在函数中没有对i ...

懂了,之前不知道global是怎么用的。三科丝
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-26 00:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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