请解释 Python 的 "pass-by-pointer" 方法
Please explain Python's "pass-by-pointer" approach
a = 5
a 本身并没有保存值 5,而只是对象 5 的地址,对吗?所以它是一个参考变量。
b = a
现在在我看来,b
,而不是再次持有 a
的地址,实际上持有 a 的 "value"
,这是对象 5 的地址.这不就是Python传值的结果吗?
但是我应该如何理解这种明显的差异?
谢谢!
没有差异。
将作业 a=5
视为将标记标签 'a' 放在 5 左右。
现在,如果您设置 b=a
,python 会查看标记为 a
(5) 的内容并为其附加一个新标签 b
。
赋值运算符从不引用变量的名称。他们总是追逐引用然后引用 chased-down value.
事实上,它并不完全像我描述的那样工作,因为对于像 int 这样的简单数据类型,内存中不仅仅是 5 的一个副本。但是您可以表现就好像它是那样工作的,并且永远不会感到惊讶。
使用列表而不是简单的整数更容易理解:
a = [1, 2, 3]
b = a
只有一个列表存在,a
和 b
现在都引用它,这解释了以下内容。
>>> b[0] = 5
>>> a
[5, 2, 3]
a = 5
a 本身并没有保存值 5,而只是对象 5 的地址,对吗?所以它是一个参考变量。
b = a
现在在我看来,b
,而不是再次持有 a
的地址,实际上持有 a 的 "value"
,这是对象 5 的地址.这不就是Python传值的结果吗?
但是我应该如何理解这种明显的差异?
谢谢!
没有差异。
将作业 a=5
视为将标记标签 'a' 放在 5 左右。
现在,如果您设置 b=a
,python 会查看标记为 a
(5) 的内容并为其附加一个新标签 b
。
赋值运算符从不引用变量的名称。他们总是追逐引用然后引用 chased-down value.
事实上,它并不完全像我描述的那样工作,因为对于像 int 这样的简单数据类型,内存中不仅仅是 5 的一个副本。但是您可以表现就好像它是那样工作的,并且永远不会感到惊讶。
使用列表而不是简单的整数更容易理解:
a = [1, 2, 3]
b = a
只有一个列表存在,a
和 b
现在都引用它,这解释了以下内容。
>>> b[0] = 5
>>> a
[5, 2, 3]