为何函数part_1可访问all_lines却无法访问context_total与全局total?
问题分析:变量访问权限差异的原因
先看给出的代码:
total = 0 with open("advent_input.txt", "r") as txt: all_lines = [] context_total = 0 for line in txt: all_lines.append((line.rstrip().split(" "))) def part_1(): # total = 0 for line in all_lines: if line[0] == "A": if line[1] == "Y": total += 8 elif line[1] == "X": context_total += 4
变量访问差异的核心原因
all_lines能正常访问的逻辑:
all_lines是在全局作用域的with代码块里初始化的,属于全局变量。在part_1函数里,你只是读取all_lines的内容(遍历它),没有对它进行赋值操作(比如all_lines = []或者all_lines += [...])。Python允许函数直接读取全局变量,只要不尝试修改(赋值)它,所以不会触发作用域冲突。total和context_total无法使用的逻辑:
全局的total、with块里定义的context_total(with块不属于局部作用域,所以context_total也是全局变量),在part_1里都用到了+=操作——这个操作本质是赋值(比如total +=8等价于total = total +8)。Python有个明确规则:如果函数内部对某个变量进行赋值,就会默认把这个变量当成局部变量,哪怕全局作用域里有同名变量。但你在
part_1里既没提前定义这些局部变量,也没通过global声明要使用全局的total/context_total,所以运行时会报错“局部变量在赋值前被引用”。
举个简单验证:如果把part_1里的total +=8改成print(total),就能正常读取全局的total;但只要一执行赋值操作,就会触发局部变量的判定逻辑。
内容的提问来源于stack exchange,提问作者Dan Smith
相关产品推荐
相关产品推荐

