鱼C论坛

 找回密码
 立即注册
查看: 3058|回复: 11

小白之路1.关于小甲鱼第30课第三题是否修改了全局变量?

[复制链接]
发表于 2015-5-18 23:35:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 citian3094 于 2015-5-23 17:52 编辑

题目是
编写一个程序,用户输入开始搜索的路径,查找该路径下包含子文件夹在内的所有视频格式文件,并创建一个文件vediolist.txt存放所有找到的文件的路径
如图所示
QQ截图20150518224918.jpg


答案代码如下:
  1. import os

  2. def search_file(start_dir, target) :
  3.     os.chdir(start_dir)
  4.    
  5.     for each_file in os.listdir(os.curdir) :
  6.         ext = os.path.splitext(each_file)[1]
  7.         if ext in target :
  8.             vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep) #使用os.sep是程序更标准,这里是否修改了全局变量
  9.         if os.path.isdir(each_file) :
  10.             search_file(each_file, target) # 递归调用
  11.             os.chdir(os.pardir) # 递归调用后切记返回上一层目录

  12. start_dir = input('请输入待查找的初始目录:')
  13. program_dir = os.getcwd()

  14. target = ['.mp4', '.avi', '.rmvb']
  15. vedio_list = []

  16. search_file(start_dir, target)

  17. f = open(program_dir + os.sep + 'vedioList.txt', 'w')
  18. f.writelines(vedio_list)  #这里仍然正确返回了,求解
  19. f.close()
复制代码

关于第9行
            vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep) #这里是否修改了全局变量?


没有使用global,可是却可以在全局中将vedio_list 的内容放进文档中,感觉好像有点奇怪?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-5-22 10:58:08 | 显示全部楼层
本帖最后由 Ricky24 于 2015-5-22 11:18 编辑
citian3094 发表于 2015-5-20 17:32
额,不太理解,如果这样的话不就没有全局变量和局部变量的区别了么?大家都在主函数中定义,然后子函数可 ...

楼主提醒的是,原来也没太深究,但自己可以用程序测试下:
>>> def test():
list.append('ssss')
print(list)

>>> list = ['kkk']
>>> print(list)
['kkk']
>>> test()
['kkk', 'ssss']
>>> print(list)
['kkk', 'ssss']
>>>
>>> def Test():
List = ['dddd']
print(List)

>>> List = ['kkkk']
>>> print(List)
['kkkk']
>>> Test()
['dddd']
>>> print(List)
['kkkk']
可以看出,列表操作符应该是会把列表默认变成全局变量。

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
~风介~ + 5 + 5 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

发表于 2015-5-19 02:36:52 | 显示全部楼层
我的理解是因为vedio_list是一个列表,曾尝试过将列表作为参数传入函数中,结果在函数中对列表(本来应该是形参,即可以理解为同名局部变量)的更改造成了函数外列表的改变,具体原因不明,但是似乎列表是特殊的存在,类似于C语言中的指针?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-19 06:53:04 | 显示全部楼层
Python中的list,本身就是全局可见的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-19 11:24:20 | 显示全部楼层
感觉append方法是全局可用的》。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-19 11:44:24 | 显示全部楼层
曾经这个问题也困扰过,问过大神以后得以解决,如果是在函数A内定义的函数B,B就可以调用A的变量,所以子函数中可以调用主函数中定义的list。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-20 17:32:53 | 显示全部楼层
Ricky24 发表于 2015-5-19 11:44
曾经这个问题也困扰过,问过大神以后得以解决,如果是在函数A内定义的函数B,B就可以调用A的变量,所以子函 ...

额,不太理解,如果这样的话不就没有全局变量和局部变量的区别了么?大家都在主函数中定义,然后子函数可以调用主函数的变量?~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-20 22:26:47 | 显示全部楼层
感谢楼主分享
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-20 22:29:11 | 显示全部楼层
看不懂!!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-22 19:49:58 | 显示全部楼层
Ricky24 发表于 2015-5-22 10:58
楼主提醒的是,原来也没太深究,但自己可以用程序测试下:
>>> def test():
list.append('ssss')

研究了下,字典的操作也是全局有效~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-24 16:58:08 | 显示全部楼层
急用鱼币,我刷点勿怪
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-25 09:05:43 | 显示全部楼层
目前看,列表、字典都可以全局有效,还有呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-16 03:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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