python函数传参方式是什么_研究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]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值