注:原创
研究目的:研究Python中函数的传参方式:传值、传地址
研究对象:Python的list和Numpy的array
准备工作:导入numpy和定义函数
代码:
import numpy as np
# ----------------------函数:传值,传地址研究---------------
def funtest(array1):
array1[0]=0 # 传进来的list是地址,不是值
array2 = array1 # list直接赋值也是赋地址
array2[1]=-1 # 因此该操作也会使array1改变
array3 = array1.copy() # 这样才不是传地址,改变array3中的元素不影响array1,但是改变array3[3]中元素影响array1
array3[2]=-2
#
array1[3][0]=0
array2[3][1]=-1
array3[3][2]=-2
研究1
测试代码:
# python 自带list研究1
print('study1')
ar = [1,2,3,[1,2,3]] # ar为list类型,ar[3]也为list类型
print(ar)
funtest(ar) #
print(ar)
结果:
study1
[1, 2, 3, [1, 2, 3]]
[0, -1, 3, [0, -1, -2]]
结论:
list作为参数传到函数里,是传了list的地址
研究2
测试代码:
# python 自带list研究2
print('study2')
ar = [1, 2, 3, [1, 2, 3]] # ar为list类型,ar[3]也为list类型
print(ar)
funtest(ar.copy()) #
print(ar)
结果:
study2
[1, 2, 3, [1, 2, 3]]
[1, 2, 3, [0, -1, -2]]
结论:
1、list的copy()作为参数传到函数里,是传了list中元素的值
2、list[3]中存储的是另一个list的地址,并不是另一个list的值
研究3
测试代码:
# numpy数组:array研究1
print('study3')
ar = [[1], 2, 3, [1, 2, 3]]
ar = np.array(ar)
print(ar)
funtest(ar.copy()) #
print(ar)
结果:
study3
[list([1]) 2 3 list([1, 2, 3])]
[list([1]) 2 3 list([0, -1, -2])]
结论:
1、当numpy的array不是方阵时,其作为参数传递到函数里的传参方式与python自带的list类似
2、此时ar的类型为ndarray,但是ar[0]和ar[3]的类型是list,不是ndarray
研究4
测试代码:
# numpy数组:array研究2
print('study4')
ar = [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
ar = np.array(ar)
print(ar)
funtest(ar.copy()) # 此时funtest里的任何改动不影响ar
print(ar)
结果:
study4
[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]
[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]
结论:
1、当numpy的array是方阵时,其copy()作为参数传递到函数里的传参方式是传值,此时funtest里的任何改动不影响ar
2、此时ar的类型为ndarray,同时ar[0]和ar[3]的类型也是ndarray,不再是list
完整代码:
import numpy as np
# ----------------------函数:传值,传地址研究---------------
def funtest(array1):
array1[0]=0 # 传进来的list是地址,不是值
array2 = array1 # list直接赋值也是赋地址
array2[1]=-1 # 因此该操作也会使array1改变
array3 = array1.copy() # 这样才不是传地址,改变array3中的元素不影响array1,但是改变array3[3]中元素影响array1
array3[2]=-2
#
array1[3][0]=0
array2[3][1]=-1
array3[3][2]=-2
if __name__ == '__main__':
# python 自带list研究1
print('study1')
ar = [1,2,3,[1,2,3]] # ar为list类型,ar[3]也为list类型
print(ar)
funtest(ar) #
print(ar)
# python 自带list研究2
print('study2')
ar = [1, 2, 3, [1, 2, 3]] # ar为list类型,ar[3]也为list类型
print(ar)
funtest(ar.copy()) #
print(ar)
# numpy数组:array研究1
print('study3')
ar = [[1], 2, 3, [1, 2, 3]]
ar = np.array(ar)
print(ar)
funtest(ar.copy()) #
print(ar)
# numpy数组:array研究2
print('study4')
ar = [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
ar = np.array(ar)
print(ar)
funtest(ar.copy()) # 此时funtest里的任何改动不影响ar
print(ar)
完整输出:
study1
[1, 2, 3, [1, 2, 3]]
[0, -1, 3, [0, -1, -2]]
study2
[1, 2, 3, [1, 2, 3]]
[1, 2, 3, [0, -1, -2]]
study3
[list([1]) 2 3 list([1, 2, 3])]
[list([1]) 2 3 list([0, -1, -2])]
study4
[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]
[[1 2 3]
[1 2 3]
[1 2 3]
[1 2 3]]