对Python函数scop的质疑

2024-04-26 20:19:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python的新手,我对这个简单的代码片段有以下疑问:

def myFunction(myList1):
    print(myList1)
    myList1 = [0, 1]

def myFunction2(myList1):
    print(myList1)
    del myList1[0]

myList1 = [2, 3]
myFunction(myList1)
print(myList1)

myList2 = [2, 3]
myFunction2(myList2)
print(myList2)

如您所见,我正在定义以列表为参数的myFunction()函数。它更改传递的列表的值。但由于参数是通过值传递的,而不是通过引用传递的,因此在该函数的作用域之外没有任何影响。实际上,当我在函数调用后打印print(myList1)值时,我仍然获得原始值。这很清楚。你知道吗

我的疑问与myFunction2()函数的行为有关,该函数接受一个列表,但将其更改为删除一个项。你知道吗

在这种情况下,当我在myFunction2()调用之后打印myList2列表的内容时,我得到原始列表是由函数修改的吗?你知道吗

为什么?我错过了什么?你知道吗


Tags: 函数代码列表参数定义def作用域print
3条回答

在Python中,lists作为reference传递。 如果在方法中重新分配一个标签,它将只影响局部范围,这是您已经知道的。 另外,由于lists是可变的,如果您不尝试创建新的list对象,而是修改现有的对象,它将按预期工作,即修改对list引用。你知道吗

请注意,在这两种情况下都是通过引用传递的,但是在第一个函数中,您更改了“指针”和它的值,myList1 = [0, 1]不会影响原始列表,因为您将myList1的指针更改为[0,1],而在函数2中,您更改了列表本身内部的内容,您访问了列表myList1[0]中的值

这与我们所做的相同:

def f(l):
    l[0] = 2 # will change the list
    l = [1,2,3] # will change l in this scope to be equals to [1,2,3]

后孔

假设你有一个盒子,它调用l,你把盒子传递给某人,假设他调用Mr.Function,他可以对盒子做任何他想做的事,改变它的值(l[0] = 2),这会改变盒子的内容,但他也可以替换盒子本身(l = [1,2,3]),这不会影响你的盒子,请注意更改我的框的内容和替换它之间的区别。你知道吗

通过引用作为参数传递的集合。你知道吗

调用myFunction时,局部变量(指针)myList1引用与全局myList1相同的内存区域。你知道吗

如果你改变一个-改变另一个。你知道吗

但是在myList1 = [0, 1]之后,局部myList1引用了list的一个完全不同的实例,改变它不会影响全局myList1。你知道吗

相关问题 更多 >