0
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(),则不会在外部影响。

4

3 回答 3

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
于 2015-01-03T10:09:18.313 回答
0

如果您想了解更多信息,我认为您需要完全了解基本的 Python。

关于你的问题的观点:

可变对象作为参数

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

不可变对象作为参数

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

更新评论:所以你将 x(Integer immutable) 传递给函数调用,你不能改变这个对象。而你在函数中重新绑定 x 引用,外部范围一无所知,完成后,外部引用仍然指向原始整数 50 对象。

于 2015-01-03T10:27:51.767 回答
0

赋值通常会改变 name 和 object 之间的绑定(当然,如果你不这样做的话x = x)。它不会对对象进行任何更改(int无论如何都不会对 s 起作用,因为它们是不可变的,但只是作为旁注)

所以在这种情况下,你的x内部函数指向50对象,直到你改变它。然后它指向另一个对象。对象本身不受影响。

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

  • 外部x指向值为 50 的 int 对象
  • 函数调用:insidex指向同一个对象
  • insidex更改为指向不同的对象,值为 2
  • 返回:外面x仍然指向50。
于 2015-01-03T10:31:34.293 回答