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值,也不会在外面实现。
答案 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。