详情见官方文档:
http://www.runoob.com/python/python-functions.html
这里说一个我碰到的例子:
def tst(a):
a.append([1,2,3])
print('函数tst中的列表a是:',a)
pass
x = ['q','w','e']
tst(x)
print('函数tst外的列表x是:',x)
输出:
函数tst中的列表a是: ['q', 'w', 'e', [1, 2, 3]]
函数tst外的列表x是: ['q', 'w', 'e', [1, 2, 3]]
从上面现象我们知道,函数在改变形参a
的同时居然也把实参x
也给改变了!
然后我又去找了一些资料才知道,在python中,strings, tuples, 和numbers是不可更改的对象,而list, dict, torch.nn.parameter.Parameter(pytorch神经网络的参数)等则是可以修改的对象。
然后我又试了一下numpy.array
,也是可修改的。
如果想在改变形参的同时又不改变实参,可以这么做:
def tst(a_):
a = a_.copy() #copy一下形参接受到的值并赋给变量a
a.append([1,2,3])
print('函数tst中的列表a是:',a)
pass
x = ['q','w','e']
tst(x)
print('函数tst外的列表x是:',x)
输出结果:
函数tst中的列表a是: ['q', 'w', 'e', [1, 2, 3]]
函数tst外的列表x是: ['q', 'w', 'e']