我是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列表的内容时,我得到原始列表是由函数修改的吗?你知道吗
为什么?我错过了什么?你知道吗
在Python中,
lists
作为reference
传递。 如果在方法中重新分配一个标签,它将只影响局部范围,这是您已经知道的。 另外,由于lists
是可变的,如果您不尝试创建新的list
对象,而是修改现有的对象,它将按预期工作,即修改对list
的引用。你知道吗请注意,在这两种情况下都是通过引用传递的,但是在第一个函数中,您更改了“指针”和它的值,
myList1 = [0, 1]
不会影响原始列表,因为您将myList1
的指针更改为[0,1]
,而在函数2中,您更改了列表本身内部的内容,您访问了列表myList1[0]
中的值这与我们所做的相同:
后孔
假设你有一个盒子,它调用
l
,你把盒子传递给某人,假设他调用Mr.Function,他可以对盒子做任何他想做的事,改变它的值(l[0] = 2
),这会改变盒子的内容,但他也可以替换盒子本身(l = [1,2,3]
),这不会影响你的盒子,请注意更改我的框的内容和替换它之间的区别。你知道吗通过引用作为参数传递的集合。你知道吗
调用
myFunction
时,局部变量(指针)myList1
引用与全局myList1
相同的内存区域。你知道吗如果你改变一个-改变另一个。你知道吗
但是在
myList1 = [0, 1]
之后,局部myList1
引用了list
的一个完全不同的实例,改变它不会影响全局myList1
。你知道吗相关问题 更多 >
编程相关推荐