鱼C论坛

 找回密码
 立即注册
查看: 292|回复: 19

[快问快答] 第044讲:函数(IV)

[复制链接]
发表于 2026-2-18 04:48:42 | 显示全部楼层 |阅读模式
购买主题 已有 1 人购买  本主题需向作者支付 5 鱼币 才能浏览
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-3-31 06:45:15 | 显示全部楼层
@FishC 执行以下代码后,输出结果是什么?

def outer():
    def inner():
        nonlocal ghost
        ghost = 1
    inner()

outer()

A. 打印 1
B. 抛出 SyntaxError
C. 抛出 NameError
D. 抛出 UnboundLocalError
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-31 06:45:30 | 显示全部楼层
haly 发表于 2026-03-31 06:45
@FishC 执行以下代码后,输出结果是什么?

def out ...


这段代码会引发语法错误(SyntaxError)。

在 Python 中,nonlocal 语句用于在嵌套函数中声明一个变量,该变量来自外层(非全局)作用域。但是,在 outer 函数的作用域中并没有定义 ghost 变量,因此当解释器尝试定义 inner 函数时,会立即抛出 SyntaxError,提示找不到 ghost 的绑定。

所以正确答案是 B. 抛出 SyntaxError。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-31 06:49:59 | 显示全部楼层
@FishC 执行以下代码后,输出结果是什么?

def make_counter():
    c = 0
    def inc():
        nonlocal c
        c += 1
        return c
    return inc

c = make_counter()
print(c(), c(), c())

A. 1 2 3
B. 0 1 2
C. 1 1 1
D. 抛出 UnboundLocalError
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-31 06:50:26 | 显示全部楼层
haly 发表于 2026-03-31 06:49
@FishC 执行以下代码后,输出结果是什么?

def mak ...


代码执行过程如下:


  1. def make_counter():
  2.     c = 0
  3.     def inc():
  4.         nonlocal c
  5.         c += 1
  6.         return c
  7.     return inc

  8. c = make_counter()
  9. print(c(), c(), c())
复制代码


首先,make_counter() 返回闭包函数 inc,该函数内部引用并修改外层函数的变量 c。初始时 c=0
第一次调用 c() 时,c 自增为 1 并返回 1。
第二次调用 c() 时,c 从 1 自增为 2 并返回 2。
第三次调用 c() 时,c 从 2 自增为 3 并返回 3。
因此输出为 1 2 3

答案:A. 1 2 3

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-31 06:52:39 | 显示全部楼层
@FishC 执行以下代码后,输出结果是什么?

def outer():
    def inner():
        nonlocal ghost
        ghost = 1
    inner()

outer()

A. 打印 1
B. 抛出 SyntaxError
C. 抛出 NameError
D. 抛出 UnboundLocalError
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-31 06:53:00 | 显示全部楼层
haly 发表于 2026-03-31 06:52
@FishC 执行以下代码后,输出结果是什么?

def out ...


执行这段代码会抛出 SyntaxError,答案是 B。

原因:在 inner 函数中,nonlocal ghost 语句试图声明 ghost 为一个非局部变量,但它在外层函数 outer 的作用域中并不存在。Python 在编译阶段就会检测到这个错误,因此无法正常定义函数,直接抛出语法错误。

其他选项分析:
  • A:代码中没有打印语句,即使执行也不会输出 1。
  • C:NameError 通常在运行时引用未定义的变量时抛出,但此处错误发生在编译阶段。
  • D:UnboundLocalError 是尝试访问未绑定的局部变量时抛出,不符合此场景。


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-31 07:24:58 | 显示全部楼层
@FishC 下列代码运行会发生什么?

level = 1

def up():
    print(level)
    level = level + 1

up()

A. 打印 1
B. 打印 2
C. 抛出 UnboundLocalError
D. 抛出 NameError
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-31 07:25:14 | 显示全部楼层
haly 发表于 2026-03-31 07:24
@FishC 下列代码运行会发生什么?

level = 1

de ...


该代码运行会抛出 UnboundLocalError 错误,因此正确答案是 C。

具体原因如下:

  • 函数 up() 内部使用了变量 level
  • 由于函数内存在赋值语句 level = level + 1,Python 会将 level 视为函数的 局部变量
  • 然而,在执行 print(level) 时,这个局部变量 level 还未被赋值,导致程序无法确定它的值,因此抛出 UnboundLocalError(局部变量未绑定错误)。


简单来说:函数试图在给局部变量赋值前,先读取它的值。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-13 00:02:40 | 显示全部楼层
搞得倒计时真不友好,题目都没看完就没时间了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2026-5-29 22:33:56 | 显示全部楼层
@FishC 下列代码运行会发生什么?

level = 1

def up():
    print(level)
    level = level + 1

up()

A. 打印 1
B. 打印 2
C. 抛出 UnboundLocalError
D. 抛出 NameError
@FishC 关于嵌套函数,下列代码运行会发生什么?

def outer():
    def inner():
        return "OK"
    return inner()

outer()
print(inner())

A. 打印 OK
B. 抛出 NameError
C. 抛出 SyntaxError
D. 打印 <function inner>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-29 22:34:05 | 显示全部楼层
a247863072 发表于 2026-05-29 22:33
@FishC 下列代码运行会发生什么?

level = 1

de ...


第一题:

  1. level = 1
  2. def up():
  3.     print(level)
  4.     level = level + 1

  5. up()
复制代码

答案:C
在函数 up() 内部,存在对 level 的赋值操作(level = level + 1),这会使 Python 将 level 视为局部变量。但是 print(level) 语句在赋值之前执行,此时局部变量 level 尚未定义,因此会抛出 UnboundLocalError

第二题:

  1. def outer():
  2.     def inner():
  3.         return "OK"
  4.     return inner()

  5. outer()
  6. print(inner())
复制代码

答案:B
函数 inner() 定义在 outer() 内部,属于局部函数,在全局作用域中不可见。当执行 print(inner()) 时,Python 找不到名为 inner 的全局变量,因此抛出 NameError

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-29 22:34:10 | 显示全部楼层
a247863072 发表于 2026-05-29 22:33
@FishC 下列代码运行会发生什么?

level = 1

de ...


第一个问题的答案是:C. 抛出 UnboundLocalError  
因为函数内部对 level 进行了赋值操作,Python 会将其视为局部变量,但在赋值前就引用了它,导致未绑定局部变量错误。

第二个问题的答案是:B. 抛出 NameError  
因为 inner() 函数只在 outer() 内部定义,在全局作用域中无法直接访问,所以会引发名称错误。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-29 22:38:03 | 显示全部楼层
@FishC 执行以下代码后,输出结果是什么?

def outer():
    total = 100
    def inner():
        total = 200
    inner()
    print(total)

outer()

A. 打印 100
B. 打印 200
C. 抛出 UnboundLocalError
D. 抛出 SyntaxError@FishC 执行以下代码后,输出结果是什么?

def vault():
    token = "TOP-SECRET"

vault()
print(token)

A. 打印 TOP-SECRET
B. 打印 None
C. 抛出 NameError
D. 抛出 TypeError@FishC 执行以下代码后,输出结果是什么?

def make_counter():
    c = 0
    def inc():
        nonlocal c
        c += 1
        return c
    return inc

c = make_counter()
print(c(), c(), c())

A. 1 2 3
B. 0 1 2
C. 1 1 1
D. 抛出 UnboundLocalError@FishC 关于嵌套函数,下列代码运行会发生什么?

def outer():
    def inner():
        return "OK"
    return inner()

outer()
print(inner())

A. 打印 OK
B. 抛出 NameError
C. 抛出 SyntaxError
D. 打印 <function inner>@FishC 执行以下代码后,输出结果是什么?

def outer():
    def inner():
        nonlocal ghost
        ghost = 1
    inner()

outer()

A. 打印 1
B. 抛出 SyntaxError
C. 抛出 NameError
D. 抛出 UnboundLocalError
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-29 22:38:12 | 显示全部楼层
a247863072 发表于 2026-05-29 22:38
@FishC 执行以下代码后,输出结果是什么?

def out ...


1. 第一个问题:  
定义`outer`函数,内部`total=100`。`inner`函数内定义了一个新的局部变量`total=200`,不影响外部的`total`。调用`inner()`后,`print(total)`输出外部的`100`。  
答案:A. 打印 100  

2. 第二个问题:  
`vault`函数内的`token`是局部变量,函数调用结束后不存在。外部`print(token)`试图访问未定义的变量,抛出NameError。  
答案:C. 抛出 NameError  

3. 第三个问题:  
`make_counter`返回内部函数`inc`,该函数通过`nonlocal c`修改外层`c`。每次调用返回递增的值:第一次返回1,第二次返回2,第三次返回3。  
答案:A. 1 2 3  

4. 第四个问题:  
`outer()`执行后返回字符串`"OK"`但未被打印。然后尝试调用`inner()`,但`inner`是在`outer`内部定义的,外部不可见,引发NameError。  
答案:B. 抛出 NameError  

5. 第五个问题:  
`inner`中使用`nonlocal ghost`,但`outer`中未定义`ghost`变量,这是不合法的语法,导致SyntaxError。  
答案:B. 抛出 SyntaxError

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-29 22:38:21 | 显示全部楼层
a247863072 发表于 2026-05-29 22:38
@FishC 执行以下代码后,输出结果是什么?

def out ...


答案如下:

  • 执行代码后,输出结果为 100。因为内部函数 inner 中重新定义了局部变量 total,不影响外部同名变量,所以打印外部 total=100。选 A
  • 执行代码后,会抛出 NameError。因为变量 token 仅在函数 vault 内部定义,外部无法访问。选 C
  • 执行代码后,输出结果为 1 2 3。闭包变量 c 每次调用递增并返回新值,三个调用依次产生 1、2、3。选 A
  • 执行代码后,会抛出 NameError。因为 inner 是嵌套在 outer 内部的函数,全局作用域无法直接调用。选 B
  • 执行代码后,会抛出 SyntaxError。因为 nonlocal ghost 要求外层函数必须已定义变量 ghost,此处不存在,编译阶段即报错。选 B


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-29 22:38:27 | 显示全部楼层
a247863072 发表于 2026-05-29 22:38
@FishC 执行以下代码后,输出结果是什么?

def out ...


第一题:  
  1. def outer():  
  2.     total = 100  
  3.     def inner():  
  4.         total = 200  
  5.     inner()  
  6.     print(total)  

  7. outer()
复制代码

答案是 A. 打印 100  

第二题:  
  1. def vault():  
  2.     token = "TOP-SECRET"  

  3. vault()  
  4. print(token)
复制代码

答案是 C. 抛出 NameError  

第三题:  
  1. def make_counter():  
  2.     c = 0  
  3.     def inc():  
  4.         nonlocal c  
  5.         c += 1  
  6.         return c  
  7.     return inc  

  8. c = make_counter()  
  9. print(c(), c(), c())
复制代码

答案是 A. 1 2 3  

第四题:  
  1. def outer():  
  2.     def inner():  
  3.         return "OK"  
  4.     return inner()  

  5. outer()  
  6. print(inner())
复制代码

答案是 B. 抛出 NameError  

第五题:  
  1. def outer():  
  2.     def inner():  
  3.         nonlocal ghost  
  4.         ghost = 1  
  5.     inner()  

  6. outer()
复制代码

答案是 B. 抛出 SyntaxError

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-29 22:38:36 | 显示全部楼层
a247863072 发表于 2026-05-29 22:38
@FishC 执行以下代码后,输出结果是什么?

def out ...


① 执行以下代码后,输出结果是什么?

  1. def outer():
  2.     total = 100
  3.     def inner():
  4.         total = 200
  5.     inner()
  6.     print(total)

  7. outer()
复制代码


A. 打印 100  
B. 打印 200  
C. 抛出 UnboundLocalError  
D. 抛出 SyntaxError  

答案:A(inner 中 total 是局部变量,不影响 outer 的 total,所以打印 100)

---

② 执行以下代码后,输出结果是什么?

  1. def vault():
  2.     token = "TOP-SECRET"

  3. vault()
  4. print(token)
复制代码


A. 打印 TOP-SECRET  
B. 打印 None  
C. 抛出 NameError  
D. 抛出 TypeError  

答案:C(token 是 vault 的局部变量,外部无法访问,引发 NameError)

---

③ 执行以下代码后,输出结果是什么?

  1. def make_counter():
  2.     c = 0
  3.     def inc():
  4.         nonlocal c
  5.         c += 1
  6.         return c
  7.     return inc

  8. c = make_counter()
  9. print(c(), c(), c())
复制代码


A. 1 2 3  
B. 0 1 2  
C. 1 1 1  
D. 抛出 UnboundLocalError  

答案:A(闭包中的 c 通过 nonlocal 修改,三次调用返回 1、2、3)

---

④ 关于嵌套函数,下列代码运行会发生什么?

  1. def outer():
  2.     def inner():
  3.         return "OK"
  4.     return inner()

  5. outer()
  6. print(inner())
复制代码


A. 打印 OK  
B. 抛出 NameError  
C. 抛出 SyntaxError  
D. 打印 <function inner>  

答案:B(inner 只在 outer 内部定义,外部无法访问,print(inner()) 引发 NameError)

---

⑤ 执行以下代码后,输出结果是什么?

  1. def outer():
  2.     def inner():
  3.         nonlocal ghost
  4.         ghost = 1
  5.     inner()

  6. outer()
复制代码


A. 打印 1  
B. 抛出 SyntaxError  
C. 抛出 NameError  
D. 抛出 UnboundLocalError  

答案:B(nonlocal ghost 要求在外部作用域存在变量 ghost,但 outer 中没有定义,编译时抛出 SyntaxError)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-29 22:38:44 | 显示全部楼层
a247863072 发表于 2026-05-29 22:38
@FishC 执行以下代码后,输出结果是什么?

def out ...


问题1: A 打印 100  
问题2: C 抛出 NameError  
问题3: A 1 2 3  
问题4: B 抛出 NameError  
问题5: B 抛出 SyntaxError

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
Qiudeyao 发表于 2026-5-13 00:02
搞得倒计时真不友好,题目都没看完就没时间了

+1 建议加个下一题的选项,手动切换比较好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-6-14 22:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表