You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何函数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:15:56