Python中的整数是按值或引用传递的吗?

阿杰

我编写了以下代码,以检查是否通过值或引用传递了整数。

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中的变量名称都是对对象的引用。分配给变量名实际上并没有更改对象本身,而是将引用设置为新对象。因此,在您的情况下:

foo = 1 #

def test(bar):
    # At this point, "bar" points to the same object as foo.
    bar = 2    # We're updating the name "bar" to point an object "int(2)".
    # 'foo' still points to its original object, "int(1)".
    print foo, bar # Therefore we're showing two different things.

test(foo)

Python语法类似于C的方式以及许多事物都是语法糖的事实可能令人困惑。记住整数对象在本质上是不可变的,似乎很奇怪,这foo += 1可能是一个有效的声明。实际上,foo += 1实际上等效于foo = foo + 1,两者都转换为foo = foo.__add__(1),实际上返回一个新对象,如下所示:

>>> a = 1
>>> id (a)
18613048
>>> a += 1
>>> id(a)
18613024
>>>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

tkinter按值而不是引用传递整数

Python:在递归提取中可以接受“按引用传递”吗?

SystemVerilog数组是按值或引用传递的吗?

python pandas dataframe,是按值传递还是按引用传递

在Javascript中按值传递和按引用传递

在Android Adapter中按值传递和按引用传递?

Java中的“按值传递”还是“按引用传递”?

在C ++线程中,我应该按值或引用传递shared_ptr吗?

在Python中通过引用传递整数

在C ++中按值传递指针吗?

整数变量按值传递,字符串变量按引用传递?

在Python中列出按引用传递

在.NET中,是按值或按引用传递的类对象

C ++中的函数重载按值或按引用传递参数

python递归通过引用还是按值传递?

在C#中按引用或值传递对象

js中的函数按值或引用复制/传递

在python中自定义类对象的参数传递:按引用调用还是按值调用求值?

在Python中通过引用和值传递

我应该按值或按(rvalue)-引用传递std :: function吗?

.bind(this)是按引用还是按值传递?

在python中模拟按值传递行为

在GoLang中按值传递或按引用传递更有效?

在Java中是按值传递数组还是按引用传递数组?

在C ++中按值传递还是按常量引用传递更好?

在C#中,我应该按值传递参数并返回相同的变量,还是按引用传递?

C ++中按引用传递和按值传递之间过载歧义的可行解决方案

我是否正确理解C中的按值传递和按引用传递?

分片是按值传递的吗?