python3中的作用域:列表作为函数的参数

fnatzsnv  于 2023-02-26  发布在  Python
关注(0)|答案(2)|浏览(172)

我正在准备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)
  • 解释输出#3-#5:*
Print #1: [2, 3] 
Print #2: [2, 3] 
Print #3: [3] 
Print #4: [3] 
Print #5: [3]

我对这些问题有点困惑:

  1. python是如何知道“my_function”def代码块中的“my_list_2”是谁的?
    1.假设我将最后3行代码从my_list_2=[2,3]更改为pluto=[2,3]
pluto = [2, 3]
 my_function(pluto)
 print("Print #5:", pluto)

这将生成一个NameError,我认为这是有意义的--那么它为什么不在初始代码中抛出一个Error呢?
1.在def块内,my_list_2Print #4 如何反映应用于my_list_1的更改?

mznpcxlj

mznpcxlj1#

是一个变量,所以它可以在你的函数中访问,在python中叫做LEGB,你可以在here中读到它。
python中的list是一个可变的变量类型,当你把my_list_2作为参数传递给你的函数时,如果你对它做了任何改变,它就会应用到你的整个代码中,因为它是可变的,所以它的改变会发生在适当的地方。

brgchamk

brgchamk2#

当你把list作为一个参数时,解释器会把链接放到对象“list”上。
所以如果你打电话

del my_list_1[0]

修改传递的实际列表,结果是my_list_1和my_list_2列表都与同一个对象相关,您可以看到一个被删除的元素。
另一种代码表示为:

my_list_1 = [2, 3]
my_list_2 = my_list_1
del my_list_2[0]
print(my_list_1, my_list_2)
# [3] [3]

相关问题