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

Python3中列表作为函数参数的作用域相关问题咨询

Python3考试代码疑问解答

原代码片段

def my_function(my_list_1):
    print("Print #1:", my_list_1)
    print("Print #2:", my_list_2)
    del my_list_1[0]  # Pay attention to this line.
    print("Print #3:", my_list_1)
    print("Print #4:", my_list_2)


my_list_2 = [2, 3]
my_function(my_list_2)
print("Print #5:", my_list_2)

输出结果

Print #1: [2, 3] 
Print #2: [2, 3] 
Print #3: [3] 
Print #4: [3] 
Print #5: [3]

疑问解答

1. 在my_function的def代码块中,Python如何识别my_list_2?

Python查找变量遵循LEGB规则:优先查找函数内部的局部作用域,找不到就往上找嵌套作用域,再找全局作用域,最后找内置作用域。这里my_list_2不是函数内定义的局部变量,Python就会去全局作用域查找,而全局作用域已经提前定义了my_list_2 = [2,3],所以能识别到这个变量。

2. 若将代码最后三行改为以下内容会触发NameError,为何初始代码不会报错?

修改后的代码片段:

pluto = [2, 3]
my_function(pluto)
print("Print #5:", pluto)

初始代码的全局作用域存在my_list_2变量,函数执行时能在全局作用域找到它;而修改后的代码里,函数内部依然在引用my_list_2,但全局作用域里只有pluto,没有my_list_2这个变量名,所以触发NameError——函数内部的print("Print #2:", my_list_2)语句从未改变,始终在查找my_list_2这个特定变量。

3. 在def代码块中,对my_list_1的修改为何会体现在Print #4的my_list_2输出中?

列表是可变对象,Python传递可变对象时,传递的是对象的内存引用。当你把my_list_2作为参数传给my_function时,my_list_1和my_list_2指向的是内存中同一个列表对象。del my_list_1[0]是直接修改了这个共享的列表对象,所以my_list_2的输出也会同步变化。


内容的提问来源于stack exchange,提问作者WobblyWindows

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:30:44