即使在调用和调用函数中id()相同,python整数参数值也不会改变

时间:2015-01-03 10:02:17

标签: python call-by-value

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()给出了对象的内存位置。即使两者都在同一位置保存,如果在func()中更改了x值,也不会在外面实现。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

指出你的问题:

可变对象作为参数

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

不可变对象作为参数

仍然无法重新绑定外部引用,甚至无法改变此对象。

更新注释:所以你将x(整数不可变)传递给函数调用,你不能改变这个对象。并且你在函数中重新绑定x参考,外部范围一无所知,完成后,外部引用仍将指向原始整数50个对象。

答案 2 :(得分:0)

分配通常会更改名称和对象之间的绑定(当然,如果你不像x = x那样做)。它没有对对象进行任何改动(无论如何它都不会对int起作用,因为它们是不可变的,但只是作为旁注)

因此,在这种情况下,函数内的x指向50对象,直到您更改它为止。然后它指向一个不同的对象。对象本身不受影响。

指出一步一步发生的事情:

  • x指向值为50的int对象
  • 函数调用:内部x指向同一对象
  • 内部x更改为指向不同的对象,值为2
  • 返回:外部x仍然指向50。