鱼C论坛

 找回密码
 立即注册
查看: 642|回复: 12

[已解决]不知道为什么可以修改全局变量的问题

[复制链接]
发表于 2018-7-23 09:27:33 | 显示全部楼层 |阅读模式

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

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

x
10 进制转2进制
我的代码写完之后,才发现修改了全局变量,而且把list放进里面,会出错。。这样反而会出结果
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-


  3. list1 = []


  4. def bin2(x):
  5.     if x == 0:
  6.         return list1
  7.     else:
  8.         list1.append(str(x % 2))
  9.         bin2(x//2)


  10. bin2(62)
  11. print(list1)
  12. str1 = ''
  13. while list1:
  14.     str1 += list1.pop()
  15. print(str1)
复制代码
最佳答案
2018-7-23 09:39:10
本帖最后由 凌九霄 于 2018-7-23 09:53 编辑

传入可变参数如list、set、dict,在函数内部对参数做出修改,参数本身发生变化。tuple、str不变,要修改需要加global关键字

十进制转2进制

十进制转2进制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-23 09:39:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 凌九霄 于 2018-7-23 09:53 编辑

传入可变参数如list、set、dict,在函数内部对参数做出修改,参数本身发生变化。tuple、str不变,要修改需要加global关键字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-23 09:42:26 | 显示全部楼层
全局变量的意思就是所有的地方都可以使用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-23 09:49:33 | 显示全部楼层
BngThea 发表于 2018-7-23 09:42
全局变量的意思就是所有的地方都可以使用

但是我修改成功了,而且没用上global
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-23 09:50:06 | 显示全部楼层
jhr622250 发表于 2018-7-23 09:49
但是我修改成功了,而且没用上global

还有我,为什么把全局变量放进函数内部就出错啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-23 09:55:14 | 显示全部楼层
jhr622250 发表于 2018-7-23 09:50
还有我,为什么把全局变量放进函数内部就出错啊

放内部的话每次递归都会被置空
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-23 09:57:43 | 显示全部楼层
凌九霄 发表于 2018-7-23 09:39
传入可变参数如list、set、dict,在函数内部对参数做出修改,参数本身发生变化。tuple、str不变,要修改需 ...

嗯嗯,我有点明白了,知道为什么修改成功了。谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-23 10:02:29 | 显示全部楼层
凌九霄 发表于 2018-7-23 09:55
放内部的话每次递归都会被置空

嗯嗯,谢谢,。。但是我刚才试了一下,输出list1,NameError: name 'list1' is not defined。为什么不能输出空列表啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-23 10:06:08 | 显示全部楼层
凌九霄 发表于 2018-7-23 09:55
放内部的话每次递归都会被置空

  1. def bin2(x):
  2.     list1 = []
  3.     if x == 0:
  4.         return list1
  5.     else:
  6.         list1.append(str(x % 2))
  7.         bin2(x//2)


  8. '''bin2(62)
  9. print(list1)
  10. str1 = ''
  11. while list1:
  12.     str1 += list1.pop()'''
  13. print(bin2(7))
复制代码


输出是none对吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-23 10:08:00 | 显示全部楼层
本帖最后由 凌九霄 于 2018-7-23 10:09 编辑
jhr622250 发表于 2018-7-23 10:02
嗯嗯,谢谢,。。但是我刚才试了一下,输出list1,NameError: name 'list1' is not defined。为什么不能 ...


下面的print(list1)之类没有注释吧,肯定是未定义了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-23 10:11:19 | 显示全部楼层
凌九霄 发表于 2018-7-23 10:08
下面的print(list1)之类没有注释吧,肯定是未定义了
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-





  3. def bin2(x):
  4.     list1 = ['empty']
  5.     if x == 0:
  6.         return list1
  7.     else:
  8.         list1.append(str(x % 2))
  9.         bin2(x//2)


  10. '''bin2(62)
  11. print(list1)
  12. str1 = ''
  13. while list1:
  14.     str1 += list1.pop()'''
  15. print(bin2(7))
复制代码

为什么输出还是none而不是['empty']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-23 10:39:36 | 显示全部楼层
jhr622250 发表于 2018-7-23 10:11
为什么输出还是none而不是['empty']


1、当函数没有显式return,默认返回None值

2、当递归函数有return时,在递归的地方也要return,不然永远返回的是None

所以
  1. def bin2(x):
  2.     list1 = []
  3.     if x == 0:
  4.         return list1
  5.     else:
  6.         list1.append(str(x % 2))
  7.         return bin2(x//2)
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-23 11:06:02 | 显示全部楼层
凌九霄 发表于 2018-7-23 10:39
1、当函数没有显式return,默认返回None值

2、当递归函数有return时,在递归的地方也要return,不然 ...

谢谢讲解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 06:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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