鱼C论坛

 找回密码
 立即注册
查看: 1190|回复: 3

[已解决]030讲第三题 列表变量问题

[复制链接]
发表于 2020-6-29 16:03:50 | 显示全部楼层 |阅读模式

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

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

x
vedio_list是全局变量,为什么全局变量可以在函数中使用?如果在函数中定义viedo_list=[],是不是在函数结尾要return viedo_lis?
import os

def search_file(start_dir, target) :
    os.chdir(start_dir)
    
    for each_file in os.listdir(os.curdir) :
        ext = os.path.splitext(each_file)[1]
        if ext in target :
            vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep)     #为什么全局变量可以在函数中使用?如果在函数中定义viedo_list=[],是不是在函数结尾要return viedo_lis? 
        if os.path.isdir(each_file) :
            search_file(each_file, target) 
            os.chdir(os.pardir)

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

target = ['.mp4', '.avi', '.rmvb']
vedio_list = []    #这个是全局变量

search_file(start_dir, target)

f = open(program_dir + os.sep + 'vedioList.txt', 'w')
f.writelines(vedio_list)
f.close()
最佳答案
2020-6-29 16:05:58
本帖最后由 Twilight6 于 2020-6-29 16:37 编辑



vedio_list是全局变量,为什么全局变量可以在函数中使用?


列表是容器类型的变量  ,只要容器本身不被改变,对容器内元素进行改变不管在函数内还是函数外都是可以的

其他的容器类型的变量还有:列表,字典,元组(只能改变元组内的可变数据,不能删除或添加元素)


如果在函数中定义viedo_list=[],是不是在函数结尾要return viedo_lis?


如果你这个时候函数外已经有了 viedo_list=[]  此时你再次定义 viedo_list=[] 会导致 Python 触发屏蔽效果,暂时屏蔽全局变量 viedo_list=[] 而创建个新的局部变量 viedo_list=[]来覆盖全局变量

这个时候只要在函数内 viedo_list 都是指局部变量而不是全局变量了,而函数是否 return 取决于你函数的功能,而你这里函数是递归,建议不用这样设置返回值,用全局变量就好

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

使用道具 举报

发表于 2020-6-29 16:05:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-6-29 16:37 编辑



vedio_list是全局变量,为什么全局变量可以在函数中使用?


列表是容器类型的变量  ,只要容器本身不被改变,对容器内元素进行改变不管在函数内还是函数外都是可以的

其他的容器类型的变量还有:列表,字典,元组(只能改变元组内的可变数据,不能删除或添加元素)


如果在函数中定义viedo_list=[],是不是在函数结尾要return viedo_lis?


如果你这个时候函数外已经有了 viedo_list=[]  此时你再次定义 viedo_list=[] 会导致 Python 触发屏蔽效果,暂时屏蔽全局变量 viedo_list=[] 而创建个新的局部变量 viedo_list=[]来覆盖全局变量

这个时候只要在函数内 viedo_list 都是指局部变量而不是全局变量了,而函数是否 return 取决于你函数的功能,而你这里函数是递归,建议不用这样设置返回值,用全局变量就好

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

使用道具 举报

发表于 2020-6-29 16:18:07 | 显示全部楼层
return 什么取决于你 函数里想要返回什么
如果你定义的viedo_lis=[] 经过函数处理以后 这个viedo_lis列表就是你想要的结果那你就return viedo_lis
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 17:20:57 | 显示全部楼层
本帖最后由 wangyq 于 2020-6-29 17:24 编辑

小甲鱼在视频里讲到了:

"可以在函数内部 访问 全局变量,但不可以在函数内部 修改 全局变量。"(原话可能有出入,但是这个意思)

这里的所谓 修改 ,其实指的是在函数内部对全局变量的 变量名(标签) 进行再次赋值。
但列表这个变量非常特殊,利用列表的内置方法,可以实现在不对 变量名 重新赋值的情况下,对列表内的元素进行修改,举一个比较形象的例子:
#在一个风和日丽的早晨

room1 = [1,2] # room1 这个标签被贴在了一个房间的门上,房间里有 1 和 2
room2 = [3,4] # room2 这个标签被贴在了一个房间的门上,房间里有 3 和 4

def function():
    #夜幕降临
    room1 = [1,2,3,4] # room1:卧槽,居然想在晚上把我贴在另一个房间上...
                      # 既然无法反抗,那就默默享受吧...
                      # 但是天亮的时候一定要把我放回原处啊喂

    room2.extend([1,2]) # 趁着夜色往 room2 里偷偷搬点东西不过分吧

#天亮了
function()

print(room1) # (结果为[1,2])
             # room1:幸好在天亮之前就回来了
             
print(room2) # (结果为[1,2,3,4])
             # room2:诶,哪来这么多东西!?

希望可以帮到你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 07:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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