Ahm*_*lag 2 python pass-by-reference variable-assignment
我想了解以下代码变体:
a = [1, 2, 3]
b = a
b.append(4)
b = ['a', 'b']
print(a, b)
Run Code Online (Sandbox Code Playgroud)
我的理解是变量a指的是一个对象,该对象包含[1,2,3]内存中某个位置的列表,b现在指的是所指的同一对象a,并且通过该链接,我们在技术上附加了一个 not b。
输出: [1, 2, 3, 4] ['a', 'b']
我稍微更新了代码:
a = [1, 2, 3]
b = ['a', 'b']
b = a
b.append(4)
print(a, b)
Run Code Online (Sandbox Code Playgroud)
我的理解: b 现在通过第三行引用两个对象,第一个列表 ['a','b']和第二个列表(a最初是指)。[1,2,3]b = a
输出: [1, 2, 3, 4] [1, 2, 3, 4]
最后的代码变体:
a = [1, 2, 3]
b = ['a', 'b']
b = a
b.append(4)
a.append(10)
print(a, b)
Run Code Online (Sandbox Code Playgroud)
根据我到目前为止的理解,我认为第 3 行上的链接b = a仅提供b了引用多个对象(它是自己的和a's)的能力,并且a应该只引用一个对象[1,2,3],因此预期的输出应该是:[1,2,3,4,10] [1,2,3,4]
实际输出: [1, 2, 3, 4, 10] [1, 2, 3, 4, 10]
那么第 3 行的这个赋值b = a是不是就像一个双向链接?atob的对象还在哪里创建了一个引用?
如果我错了,我希望有人可以为我清除这种困惑并纠正我的想法。谢谢你。
我的理解: b 现在指的是两个对象, . . .
那是不正确的。一个名称不能同时与给定范围内的多个对象相关联。
b = a与关联b的对象a关联。在该行执行后,将没有任何内容引用['a', 'b'],并且该列表应该有资格进行垃圾回收,因为它不能再被使用。
不要将对象视为指针,我认为这是您混淆的根源。不是“b 指向a”或“a 指向b”,它与绑定到对象有关。我认为看id会很有用
>>> a = [1, 2, 3]
>>> id(a)
1833964774216
>>> b = a
>>> id(b)
1833964774216
Run Code Online (Sandbox Code Playgroud)
在这种情况下,a和b都绑定到该列表。因此,对列表的任何更改1833964774216都将反映在两个对象中。但我可以重新分配(或重新绑定)到一个完全不同的对象
>>> b = [4, 5, 6]
>>> id(b)
1833965089992
>>> b
[4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
这没有任何影响,a因为它仍然绑定到原始列表
>>> a
[1, 2, 3]
>>> id(a)
1833964774216
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |