pass by reference for mutable object?
初始化变量a和b。a的id=559599568,b的id=559251864。
然后在函数change()中将b赋给a,期望a指向b的位置,a具有b的值。
但是,我发现a确实指向了b在函数中的位置(如您所见,当在函数内部打印时,它们的ID都为559251864),但是一旦函数返回,a就会指向它的原始ID,即559599568。
为什么a一返回就指向它原来的内存ID?我以为Python是通过引用传递的,如果它是可变对象?请纠正我。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| a = pd.DataFrame(range(3))
b = pd.DataFrame(range(5))
def change(origin,new):
print id(origin)
print id(new)
origin = new
print id(origin)
print id(new)
change(a,b)
Out[24]: change(a,b)
559599568
559251864
559251864
559251864
a
Out[25]:
0
0 0
1 1
2 2
b
Out[26]:
0
0 0
1 1
2 2
3 3
4 4
id(a)
Out[27]: 559599568L
id(b)
Out[28]: 559251864L |
- 从技术上讲,每个变量都是对另一个对象的引用。但是变量本身是按值传递的;不能通过将变量作为参数传递给函数来更改变量的值。您可能需要阅读nedbatchelder.com/text/names.html。
- python参数传递与可变或不可变对象相同。查看关于Python名称和值的事实和神话。
- python从不被引用调用,对象的可变性与评估策略无关。Python评估策略是通过共享来调用的,它与Java(参考类型)和大多数现代语言(如JavaScript、Ruby等)、维基百科。
是的,Python正在传递对对象的引用(通过共享调用)。但你的任务origin = new也在分配参考。因此,这使得origin和new在函数范围内引用同一对象,但不会改变函数之外的任何内容。
- 我认为说Python是通过引用来传递的,这会使水变得模糊不清。它从技术上讲是共享调用,这与引用调用不同。实际上,引用调用的特性是调用方可以看到分配。人们倾向于使用"参考呼叫"的方式,但比较宽松…
- @谢谢,很有趣,今天学到了一些东西。更新了我的答案。
- 感谢你修复了它,这是我的一个小毛病:)再次,我认为大多数人会理解"参照调用"的意思是"传递一个对对象的引用",但我喜欢保持术语的直白,我相信在这方面的漂移只会使所有事情变得更加混乱。