请解释一下 Python 的“逐指传递”方法 [duplicate]

Please explain Python's "pass-by-pointer" approach [duplicate]

提问人:Fabian Lohrmann 提问时间:3/17/2018 最后编辑:Gastón SaillénFabian Lohrmann 更新时间:3/17/2018 访问量:821

问:

a = 5

a 本身并不包含值 5,而只是对象 5 的地址,对吗?所以它是一个参考变量。

b = a 

现在在我看来,不是再次持有 的地址,而是持有 的地址,这是对象 5 的地址。这难道不是 Python 按值传递的结果吗?ba"value"

但是,我应该如何理解这种明显的差异呢?

谢谢!

Python 变量 按引用 值传递

评论

0赞 melpomene 3/17/2018
你怎么能分辨出引用和持有副本之间的区别?这不像是可变的。b5b55
0赞 Fabian Lohrmann 3/17/2018
因为在 Python 中,5 是一个对象,变量不会“存储”对象,它们只是“引用”它们。b = 5 意味着 b 既不持有 5 的副本,也不持有 5 本身的副本,而是 b 现在指的是对象 5。

答:

2赞 Pascal 3/17/2018 #1

没有差异。

将作业想象成在 5 周围放置一个带标签的标签“a”。a=5

现在,如果您设置 ,python 会查看标记为 (5) 的内容,并为其附加一个新标签。b=aab

赋值运算符从不引用变量的名称。它们总是向下追查引用,然后再引用追查的

事实上,它并不像我描述的那样工作,因为对于简单的数据类型(如 ints),内存中不仅仅是 5 的单个副本。但你可以表现得好像它是这样工作的,永远不会感到惊讶。

如果使用列表而不是简单的整数,则更容易理解:

a = [1, 2, 3]
b = a

只有一个列表存在,现在两者都引用了它,这解释了以下内容。ab

>>> b[0] = 5
>>> a
[5, 2, 3]

评论

0赞 Charles Duffy 3/17/2018
对于足够小的整数可以自动内切,内存中通常只有一个副本。也就是说,对于正在使用的特定示例,过度简化可能会起作用。:)
0赞 Fabian Lohrmann 3/17/2018
是的,我听说过同样的话。我有点困惑,帕斯卡说这过于简单化了。谢谢:)