提问人:Fabian Lohrmann 提问时间:3/17/2018 最后编辑:Gastón SaillénFabian Lohrmann 更新时间:3/17/2018 访问量:821
请解释一下 Python 的“逐指传递”方法 [duplicate]
Please explain Python's "pass-by-pointer" approach [duplicate]
问:
a = 5
a 本身并不包含值 5,而只是对象 5 的地址,对吗?所以它是一个参考变量。
b = a
现在在我看来,不是再次持有 的地址,而是持有 的地址,这是对象 5 的地址。这难道不是 Python 按值传递的结果吗?b
a
"value"
但是,我应该如何理解这种明显的差异呢?
谢谢!
答:
2赞
Pascal
3/17/2018
#1
没有差异。
将作业想象成在 5 周围放置一个带标签的标签“a”。a=5
现在,如果您设置 ,python 会查看标记为 (5) 的内容,并为其附加一个新标签。b=a
a
b
赋值运算符从不引用变量的名称。它们总是向下追查引用,然后再引用追查的值。
事实上,它并不像我描述的那样工作,因为对于简单的数据类型(如 ints),内存中不仅仅是 5 的单个副本。但你可以表现得好像它是这样工作的,永远不会感到惊讶。
如果使用列表而不是简单的整数,则更容易理解:
a = [1, 2, 3]
b = a
只有一个列表存在,现在两者都引用了它,这解释了以下内容。a
b
>>> b[0] = 5
>>> a
[5, 2, 3]
评论
0赞
Charles Duffy
3/17/2018
对于足够小的整数可以自动内切,内存中通常只有一个副本。也就是说,对于正在使用的特定示例,过度简化可能会起作用。:)
0赞
Fabian Lohrmann
3/17/2018
是的,我听说过同样的话。我有点困惑,帕斯卡说这过于简单化了。谢谢:)
评论
b
5
b
5
5