【发布时间】:2020-04-18 04:27:39
【问题描述】:
我想澄清一下 Python 中的一个简单指针机制。考虑以下几点:
u = [1,2]
v = [u,3]
print(v)
u[0] = 100
print(v)
那么结果就是
[[1,2],3]
[[100,2],3]
同时如果我们执行
u = [1,2]
v = [u,3]
print(v)
u = [100,2]
print(v)
那么结果就是
[[1,2],3]
[[1,2],3]
我认为这是因为在第一个代码中,u 存储的指针始终没有改变,而在第二个代码中,u 存储的指针从声明 u=[100,2] 更改,但声明 @987654333 @ 存储了初始指针本身,而不是变量 u。
这是为什么发生这种情况的正确解释吗?
【问题讨论】:
-
当然。要为第二个数组获得相同的行为,您必须执行 u[:] = [100, 2]。
-
Ned Batchelder 文章的必填链接:nedbatchelder.com/text/names.html
-
第二个例子中的赋值使得
u指向一个不同的对象,所以对u的操作不再影响v中的对象。 -nedbatchelder.com/text/names.html。 …docs.python.org/3/reference/……docs.python.org/3/reference/…. -
如果您在 Python Visualizer 工具中运行这两个示例,您将很容易理解发生了什么pythontutor.com/visualize.html#mode=edit
-
Python 容器保存对对象的引用。一切都是对象。值是一个对象。名称是一个引用(任何一个术语都比术语变量更可取,后者会调用一个存储值的框,因为这不适用于 Python)。您将名称绑定到对象,或就地更改对象。将名称重新绑定到另一个对象不会影响原始对象,除非不再引用它。