DorothyLi 发表于 2020-6-29 16:03:50

030讲第三题 列表变量问题

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)
      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()

Twilight6 发表于 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 取决于你函数的功能,而你这里函数是递归,建议不用这样设置返回值,用全局变量就好

叶小贤 发表于 2020-6-29 16:18:07

return 什么取决于你 函数里想要返回什么
如果你定义的viedo_lis=[] 经过函数处理以后 这个viedo_lis列表就是你想要的结果那你就return viedo_lis

wangyq 发表于 2020-6-29 17:20:57

本帖最后由 wangyq 于 2020-6-29 17:24 编辑

小甲鱼在视频里讲到了:

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

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

#在一个风和日丽的早晨

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

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

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

#天亮了
function()

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

希望可以帮到你{:5_109:}
页: [1]
查看完整版本: 030讲第三题 列表变量问题