Python 3.9.1 跨函数访问局部变量实现IP地址SHA256哈希
跨函数使用其他函数局部变量的正确实现逻辑
首先明确Python作用域的基础规则:函数内部定义的局部变量,仅在函数自身的运行周期内有效,一旦函数执行结束,默认这些局部变量就会被内存回收,不会自动对其他函数或全局作用域可见。你之前尝试在sha256函数内直接引用hexidecimal_ip的写法,本质上是在当前作用域找一个不存在的全局变量,自然会触发变量未定义的报错。
关键认知:return 的实际作用
很多新手会误以为给函数加上return语句,就能把内部的局部变量“暴露”成全局可访问的变量名,这是对return的误解。return的核心作用是:将函数计算出的某个值,作为函数调用表达式的执行结果,返回给调用这个函数的位置——它仅传递值本身,不会把函数内部的变量名、变量作用域同步到外部。
举个直观的对应关系:
- 之前你写的
get_ip()加上return hexidecimal_ip之后,如果你在外部写my_val = get_ip(),那么get_ip内部计算出的十六进制IP字符串,就会被赋值给外层的my_val变量;此时my_val是属于外层作用域的变量,其他函数只要能拿到这个外层变量的引用,就可以正常使用它的值。
拆分结构的标准实现步骤
按照“单一职责”的原则拆分每个函数的功能,通过“返回值传值+入参接值”的方式完成跨函数的数据传递,不需要依赖全局变量就能让代码结构清晰、可复用性更强:
- 保持
get_ip函数的核心职责:获取本机IP、转成无点的十进制、转成十六进制形式,最后把十六进制IP值作为返回值传出 - 修改
sha256函数:取消写死从终端input读取内容的逻辑,改为接收一个传入的字符串作为待哈希内容,函数本身只负责“对传入的字符串计算SHA256值并输出结果” - 写独立的主执行逻辑:依次调用两个函数,把第一步拿到的十六进制IP值,作为参数传入哈希函数完成计算
修正后可直接运行的完整代码
import hashlib as hb import socket def get_ip(): hostname = socket.gethostname() ip = socket.gethostbyname(hostname) print("Your IP address is:", ip) dotless_ip = ip.replace(".", "") hexidecimal_ip = hex(int(dotless_ip)) print("Your IP address in hexadecimal is: ", hexidecimal_ip) # 把内部计算好的十六进制IP值作为结果返回 return hexidecimal_ip def sha256(content: str): # 用传入的待哈希内容生成UTF-8编码的字节流 SHA256_convert = bytearray(content, "utf8") hasher = hb.sha256() hasher.update(SHA256_convert) hash_result = hasher.hexdigest() print(f"Your hashed content is: {hash_result}") # 也可以将哈希结果返回给外部调用位置 return hash_result # 主程序执行入口 if __name__ == "__main__": # 调用get_ip,接收它返回的十六进制IP值,存为外层变量 hex_ip = get_ip() # 把外层的hex_ip变量作为参数,传入sha256函数完成哈希计算 sha256(hex_ip)
新手高频踩坑提醒
- 不要硬靠
global关键字把局部变量声明成全局变量来跨函数引用,这种写法会让变量的作用域混乱,后续调试时很难追踪变量的修改来源,属于工程上不推荐的实现方式 - 你之前写的
bytearray(hexidecimal_ip), "utf8")存在括号匹配错误,正确的写法是把待编码字符串和编码格式都作为bytearray的参数,也就是bytearray(hexidecimal_ip, "utf8") - 拆分函数的核心优势是复用:修改后的
sha256函数既可以传入IP十六进制值做哈希,也可以直接传入任意你想要处理的字符串做哈希,不需要为不同的待处理内容单独重写哈希逻辑
内容的提问来源于stack exchange,提问作者lezamin
相关产品推荐
相关产品推荐

