网站pv uv 多少算好站wordpress版权加密
web/
2025/10/7 17:49:15/
文章来源:
网站pv uv 多少算好站,wordpress版权加密,设计师培训机构有哪些,农业开发公司企业网站建设今天我们要来聊聊一个让人又爱又恨的话题——局部变量与全局变量的八大迷雾。在Python的世界里#xff0c;变量就像是你的小宠物#xff0c;有时候它们乖乖听话#xff0c;但一不小心就给你挖了个大坑#xff01;别担心#xff0c;今天我们就一起把这些陷阱挖出来#xf…今天我们要来聊聊一个让人又爱又恨的话题——局部变量与全局变量的八大迷雾。在Python的世界里变量就像是你的小宠物有时候它们乖乖听话但一不小心就给你挖了个大坑别担心今天我们就一起把这些陷阱挖出来填平它让你的编程之路畅通无阻
1. 基础篇什么是局部和全局变量
想象你在厨房做饭ingredient食材是全局的因为整个厨房都能用到它。而当你在切洋葱时那把刀(knife)就是局部的只在这个特定任务函数里使用。
ingredient 洋葱def chop():knife 锋利的菜刀print(f用{knife}切{ingredient})chop()这里knife仅在chop函数内部可见就是局部变量而ingredient是全局变量哪里都能访问。
2. 修改全局变量的第一坑你以为你能改
直接在函数里修改全局变量Python可不轻易让你得逞
global_var 10def change_global():global_var 20 # 注意这只是创建了一个新的局部变量change_global()
print(global_var) # 猜猜看输出是多少输出还是10Python说“嘿你这是新建了个局部的global_var原来的我可没动哦。”
3. 正确修改全局变量要用global关键字
想动我的全局变量得先打招呼
global_var 10def change_global_correctly():global global_varglobal_var 20change_global_correctly()
print(global_var) # 这次对了吧这次输出是20因为我们明确告诉Python“嘿我要动的是全局的那个家伙。”
4. 局部变量的“幽灵”效应
当你在函数内未声明就使用变量名Python会认为你在找全局变量但这可能会引发一些诡异的现象。
def mystery():print(unknown_var) # 啊哦这是谁try:mystery()
except NameError as e:print(e) # 未知变量错误它真的存在吗这会抛出NameError提醒你“unknown_var”这个幽灵并不存在于全局空间。
5. 非直观的变量作用域嵌套函数
嵌套函数可以访问外层函数的变量但修改时要小心
def outer():outer_var 外层的宝藏def inner():print(outer_var) # 能找到我外公的宝藏吗outer_var 被内层修改了 # 实际上这创造了一个新的局部变量inner()print(outer_var) # 外层的值会变吗outer() # 来看看结果你会发现外层的值没变因为内层创建了一个同名的局部变量。
6. 使用nonlocal关键字的场景
当你确实想在嵌套函数中修改外层函数的变量时nonlocal来帮忙
def outer():outer_var 原始宝藏def inner():nonlocal outer_varouter_var 宝藏升级了print(outer_var)inner()print(outer_var) # 这次会怎样outer() # 哈哈成功修改nonlocal关键字让Python知道你想修改的是外层的变量不是创建新的。
7. 全局变量的滥用是福还是祸
全局变量用得爽但过度依赖就像吃太多糖短期内甜长期有害。它可能导致代码难以维护和测试。尽量通过函数参数和返回值传递数据保持模块间的独立性这样你的代码才会更健康
8. 小心闭包的陷阱
闭包是Python中的高级特性但也可能因变量作用域而让人困惑。
def create_counter():count 0def counter():nonlocal countcount 1return countreturn countermy_counter create_counter()
print(my_counter()) # 1
print(my_counter()) # 2
# 看count被正确地保留和增加了闭包可以记住外部函数的状态但记得这也意味着它可能会保留比预期更多的内存所以使用时要谨慎。 高级技巧
9. 利用模块级别的变量
在大型项目中有时需要在整个模块范围内共享数据。你可以定义模块级别的变量来实现这一目的。但请记住这样做可能会增加模块间的耦合度要谨慎使用。
# my_module.py
shared_data []def add_to_shared(data):shared_data.append(data)def get_shared():return shared_data# 另一个文件中使用
import my_modulemy_module.add_to_shared(Hello)
print(my_module.get_shared()) # 输出: [Hello]10. 全局变量的替代方案配置文件与环境变量
在处理配置信息或应用设置时使用配置文件如.ini, .json, 或环境变量是一个更好的选择而不是硬编码全局变量。这样可以提高代码的灵活性和可维护性。
# 假设有一个config.json
{database: my_db,port: 5432
}import json
import os# 读取配置文件
with open(config.json) as f:config json.load(f)# 或者使用环境变量
DB_NAME os.getenv(DB_NAME, default_db) # 如果环境变量不存在则使用default_db11. 上下文管理器与with语句
虽然这不是直接关于变量作用域的但了解上下文管理器可以帮助你更好地管理资源比如文件操作时的自动关闭。
with open(myfile.txt, w) as file:file.write(Hello, world!)
# 文件在这里自动关闭无需显式调用file.close()这里的file变量在with块内有效一旦执行完毕Python会确保资源得到释放。
12. 闭包的高级应用记忆化
记忆化是一种优化技术用于存储函数计算的中间结果减少重复计算。这对于有重叠子问题的递归函数尤其有用。
def memoize(func):cache {}def wrapper(*args):if args not in cache:cache[args] func(*args)return cache[args]return wrappermemoize
def fibonacci(n):if n 1:return nelse:return fibonacci(n-1) fibonacci(n-2)print(fibonacci(10)) # 55而且只计算了一次n1到n10通过这种方式memoize装饰器创建了一个闭包它记录了函数调用的结果避免了重复劳动。 这些额外的知识点和技巧希望能为你的Python学习之旅增添更多色彩。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88604.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!