Python全局列表访问问题:函数内修改不生效的原因及解决方法
为什么全局列表
abc没被修改?怎么解决? 嗨,刚学Python遇到这种变量作用域的问题太正常啦,我来给你掰扯清楚~
问题原因:局部变量 vs 全局变量
你代码里的两个abc其实是完全不同的变量:
- 最开头定义的
abc = []是全局变量,作用范围覆盖整个代码文件; - 函数
foo里的abc = name.split(',')是局部变量,只在foo函数内部有效。
当你在函数里给abc赋值时,Python会默认创建一个新的局部变量,而不是去修改外面的全局abc。所以函数执行完后,全局的abc还是原来的空列表,这就是第7行输出[]的原因。
解决方法:三种常见方案
1. 使用global关键字声明全局变量
在函数内部先声明abc是全局变量,这样赋值时就会直接修改全局的那个列表:
abc = [] name = "apple,orange" def foo(name): global abc # 声明abc是全局变量 abc = name.split(',') print(abc) foo(name) print(abc) print(name)
运行后第7行就会输出['apple', 'orange']啦。
2. 让函数返回修改后的列表,全局变量接收结果
这种方式更符合Python的函数设计习惯(尽量少用全局变量):
abc = [] name = "apple,orange" def foo(name): new_abc = name.split(',') print(new_abc) return new_abc # 返回处理后的列表 abc = foo(name) # 用全局变量接收返回值 print(abc) print(name)
3. 利用可变对象的特性修改列表(不重新赋值)
因为列表是可变对象,你可以直接修改它的内容而不是重新赋值,这样不需要global也能操作全局列表:
abc = [] name = "apple,orange" def foo(name): abc.clear() # 清空原列表 abc.extend(name.split(',')) # 把分割后的元素添加进去 print(abc) foo(name) print(abc) print(name)
这种方法避免了全局变量的直接赋值,有时候会更安全~
内容的提问来源于stack exchange,提问作者ShaAk
相关产品推荐
相关产品推荐

