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:37 编辑
vedio_list是全局变量,为什么全局变量可以在函数中使用?
列表是容器类型的变量,只要容器本身不被改变,对容器内元素进行改变不管在函数内还是函数外都是可以的
其他的容器类型的变量还有:列表,字典,元组(只能改变元组内的可变数据,不能删除或添加元素)
如果在函数中定义viedo_list=[],是不是在函数结尾要return viedo_lis?
如果你这个时候函数外已经有了 viedo_list=[]此时你再次定义 viedo_list=[] 会导致 Python 触发屏蔽效果,暂时屏蔽全局变量 viedo_list=[] 而创建个新的局部变量 viedo_list=[]来覆盖全局变量
这个时候只要在函数内 viedo_list 都是指局部变量而不是全局变量了,而函数是否 return 取决于你函数的功能,而你这里函数是递归,建议不用这样设置返回值,用全局变量就好
return 什么取决于你 函数里想要返回什么
如果你定义的viedo_lis=[] 经过函数处理以后 这个viedo_lis列表就是你想要的结果那你就return viedo_lis 本帖最后由 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]