研究Python中函数的传参方式

注:原创
研究目的:研究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]]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容