python函数的参数调用前后id的分析

python函数传递参数其id不会发生变化,但数如果参数在函数中的id发生了变化,那么这样的值变化就不会影响函数之外的参数值的变化!


import torch
def a (x):
    print("改变前x的id",id(x))
    x.requires_grad = False
    print("改编后x的id",id(x))


def b (x):
    print("在函数中")
    print("改变前x的id",id(x))
    x = True
    print("改变后x的id",id(x))


ss = torch.tensor(100.,requires_grad = True)
print("改变前id(ss) = "+str(id(ss)))
a(ss)
print("改变后id(ss) = "+str(id(ss)))
print(ss.requires_grad)

print("改变前id(ss.requires_grad) = "+str(id(ss.requires_grad)))
b(ss.requires_grad)
print("改变后id(ss.requires_grad) = "+str(id(ss.requires_grad)))
print(ss.requires_grad)

hafjk = [1,4,2,3]
def c(x):
    x.append(7)

c(hafjk)
print(hafjk)


输出结果如下:
改变前id(ss) = 140471637589272
改变前x的id 140471637589272
改编后x的id 140471637589272
改变后id(ss) = 140471637589272
False
改变前id(ss.requires_grad) = 94302852516288
在函数中
改变前x的id 94302852516288
改变后x的id 94302852516320
改变后id(ss.requires_grad) = 94302852516288
False
[1, 4, 2, 3, 7]

可以看到函数中
传入参数时实参和型参的id是一致的,如果我们直接改变型参的值而不是改变型参属性值那么型参的id会发生变化,进而改变不会影响到原来的参数,但是如果我么改变的是型参的属性,那么型参的id是不会发生变化的,这样改变就会保留。

对于变量值为数字、元组、字符串,如果进行更改就会改变变量的id,所以通过函数的型参是没有办法改变他们的,但是如果变量是列表、字典等,我们可以通过类似于修改属性的方法,如存在列表a,利用列表中函数a.append(元素),而不修改列表a本身导致列表a的id不变来使得函数可以通过函数的参数传递来修改a。

这里给出更加详细的解释链接,这篇文章的解释观点与我不同!

你可能感兴趣的:(python,python,开发语言)