我以为Python通过引用传递了所有东西?

Fer*_*uzz 6 python scope

请使用以下代码

#module functions.py
def foo(input, new_val):
    input = new_val

#module main.py
input = 5
functions.foo(input, 10)

print input
Run Code Online (Sandbox Code Playgroud)

我以为输入现在是10.为什么不是这样?

Sve*_*ach 13

所有内容都按值传递,但该值是对原始对象的引用.如果修改对象,则调用者可以看到更改,但无法重新分配名称.而且,许多对象是不可变的(整数,浮点数,字符串,元组).

  • "[Idiomatic Python](http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables)"很好地说明了这一现象. (8认同)
  • Python 不是按值调用或按引用调用,有关详细信息,请参阅我的回答。 (2认同)

hoc*_*chl 8

在foo中,您将本地名称绑定input到另一个对象(10).在调用上下文中,名称input仍引用该5对象.


Fre*_*Foo 5

Python中的赋值不会就地修改对象.它重新绑定一个名称,以便在之后input = new_val,局部变量input获得一个新值.

如果要修改"外部" input,则必须将其包装在可变对象(如单元素列表)中:

def foo(input, new_val):
    input[0] = new_val

foo([input])
Run Code Online (Sandbox Code Playgroud)

Python不完全按照C++引用传递的方式进行传递.至少在这种情况下,它更像是每个参数都是C/C++中的指针:

// effectively a no-op!
void foo(object *input, object *new_val)
{
    input = new_val;
}
Run Code Online (Sandbox Code Playgroud)