【发布时间】:2013-10-24 07:32:25
【问题描述】:
我编写了以下代码来检查整数是按值传递还是按引用传递。
foo = 1
def f(bar):
print id(foo) == id(bar)
bar += 1
print foo, bar
f(foo)
我得到的输出是
True
1, 2
在 Python 文档中,id(object) 返回对象的标识。在CPython 实现中,这是对象在内存中的地址。既然函数体第一条语句返回True,说明foo已经被引用传递了,但是为什么最后一条语句打印的是1, 2而不是2, 2呢?
【问题讨论】:
-
在 Python 中,一切都是按值传递的。
-
因为整数是不可变的。
-
@hcwhsa 整数不是按值传递的,因为它们是不可变的。 Python 中的整数(和所有其他值)总是按值传递。但是,您可以传递 references,这是不同的。换句话说,您可以按值传递引用。
-
@ajay
f(foo)实际上等同于bar = foo,即它创建了对同一对象的新引用,这就是为什么foo is bar是True。但是+=对整数的操作(和所有操作)总是返回一个新的整数,即在bar += 1之后,bar将引用一个新对象,foo仍然引用相同的旧对象,它仍然没有改变。
标签: python