python整型参数值没有改变,即使id()在调用和被调用函数时是相同的

2024-03-28 21:49:53 发布

您现在位置:Python中文网/ 问答频道 /正文

def func(x):
    print "inside function" ,id(x)
    x = 2
x = 50
print "outside function" ,id(x)
print 'Value of x before function call is', x
func(x)
print 'Value of x after function call is', x

输出:

outside function 6486996
Value of x before function call is 50
inside function 6486996
Value of x after function call is 50

假设id()给出了对象的内存位置。即使两者都保存在同一位置,如果x值在func()中更改,则不会在外部影响。你知道吗


Tags: of对象内存idisvaluedeffunction
3条回答

啊,但是函数中的id(x)调用引用了传递给函数的全局x,但是x = 2创建了一个新的局部x。请尝试以下操作:

def func(x):
    print "inside function", id(x)
    x = 2
    print "still inside function", id(x)

x = 50
print "outside function" , id(x)
print 'Value of x before function call is', x
func(x)
print 'Value of x after function call is', x

典型输出

outside function 168950596
Value of x before function call is 50
inside function 168950596
still inside function 168951172
Value of x after function call is 50

如果你想了解更多,我想你需要完全理解基本的python。你知道吗

关于你的问题:

可变对象作为参数

函数获取对该对象的引用并可以对其进行变异,但如果在方法中重新绑定引用,则外部作用域将一无所知,完成后,外部引用仍将指向原始对象。你知道吗

作为参数的不可变对象

仍然不能重新绑定外部引用,甚至不能改变这个对象。你知道吗

更新注释:所以u传递x(整数不可变)到函数调用,你不能改变这个对象。如果你在函数中重新绑定x引用,外部作用域什么都不知道,完成后,外部引用仍然指向原来的整数50对象。你知道吗

赋值通常会更改名称和对象之间的绑定(当然,如果您不执行x = x之类的操作)。它不会对对象做任何更改(反正对int不起作用,因为它们是不可变的,只是作为旁注)

因此在本例中,函数中的x指向50对象,直到您更改它为止。然后它指向另一个对象。对象本身不受影响。你知道吗

要一步一步地指出发生了什么:

  • outsidex指向值为50的int对象
  • 函数调用:insidex指向同一对象
  • insidex更改为指向不同的对象,值为2
  • return:outsidex仍然指向50。你知道吗

相关问题 更多 >