在python中, parameter sent to function 使用的全部是 by object。
也就是,这无法通过by value或者 by reference 来定义。这是python的独到之处。
如果object本身是immutable的,例如一个不是太长的整数,那么你可以看作是传值。因为每一次对这个object赋值,都会创建一个新的object,如下:
a=10
def function1(value):
value=20
print(value)
function1(a)
print(a)
结果是
20
10
虽然传过去的是a这个object,但当function1对a赋值的时候,其实他并没有改变a,而是创建了一个新的object,这个object叫做value了。global当中的a并没有变。
如果object本身是mutable,例如一个list,因为每一次对这个object赋值,都会改变这个object本身。那么就可以看作是传reference。如下:
a=[10,11,12,13]
def function1(value):
value[1:3]=[]
print(value)
function1(a)
print(a)
结果是
[10,13]
[10,13]
list.reverse 是一个in-place method。也就是说,reverse是在原来object上操作,而不会创造一个新的object。上面t=s,按照python传object的标准,那么就是t=s 是同一个object。.reverse作用在这个object上,那么t,s都变了。他们只是名字而已。
而slicing [::] 这个,会创造一个新的object。所以。自然啦。
最好的办法是deep copy.
本文深入探讨了Python中参数传递的机制,解释了为何在Python中使用的是对象传递,而不是值传递或引用传递。通过实例展示了不可变类型如整数在函数调用中的行为类似于值传递,而可变类型如列表的行为则类似于引用传递。
1万+

被折叠的 条评论
为什么被折叠?



