通过作业:Python
Passing by assignment: Python
我想理解以下代码变体:
a = [1, 2, 3]
b = a
b.append(4)
b = ['a', 'b']
print(a, b)
我的理解是,变量 a
指的是一个对象,该对象在内存中的某个位置包含列表 [1,2,3]
,而 b
现在指的是与 a
指的是,通过 link 我们在技术上附加了一个 not b.
输出:[1, 2, 3, 4] ['a', 'b']
我稍微更新了代码:
a = [1, 2, 3]
b = ['a', 'b']
b = a
b.append(4)
print(a, b)
我的理解: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)
根据我目前的理解,我认为第 3 行 b = a
上的 link 只提供了 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
是否类似于双向 link? a
还创建了对 b
对象的引用?
我希望有人能为我解决这个困惑,如果我错了,请纠正我的想法。
谢谢。
My understanding: b is now referring to two objects, . . .
这是不正确的。一个名称不能同时与给定范围内的多个对象相关联。
b = a
将 b
与 a
关联的对象相关联。该行执行后,将没有任何内容引用 ['a', 'b']
,并且该列表应该符合垃圾回收条件,因为它不能再被使用。
不要把对象想成指针,我认为那是你困惑的根源。不是“b指向a”或“a指向b”,它与绑定到一个对象有关。我觉得看看 id
会有用
>>> a = [1, 2, 3]
>>> id(a)
1833964774216
>>> b = a
>>> id(b)
1833964774216
在这种情况下,a
和 b
都绑定到该列表。因此,列表 1833964774216
的任何变化都将反映在两个对象中。但是我可以re-assign(或re-bind)到一个完全不同的对象
>>> b = [4, 5, 6]
>>> id(b)
1833965089992
>>> b
[4, 5, 6]
这对 a
没有任何影响,因为它仍然绑定到原始列表
>>> a
[1, 2, 3]
>>> id(a)
1833964774216
让我们了解名称和对象之间的区别。在您的例子中,a 和 b 是名称,分配给 a 和 b 的列表“[1,2,3]”是对象。最初 a = [1,2,3] 并且在 a 被分配给 b 即 b=a 之后,在这种情况下 a 和 b 都绑定到同一个列表对象。这意味着您可以使用名称 a 或 b 中的任何一个来更改该列表对象的值。
这可以通过将分配给 a 的列表复制到 b 来解决,
b = a.copy()
这将创建分配给 b
的同一对象的副本
我想理解以下代码变体:
a = [1, 2, 3]
b = a
b.append(4)
b = ['a', 'b']
print(a, b)
我的理解是,变量 a
指的是一个对象,该对象在内存中的某个位置包含列表 [1,2,3]
,而 b
现在指的是与 a
指的是,通过 link 我们在技术上附加了一个 not b.
输出:[1, 2, 3, 4] ['a', 'b']
我稍微更新了代码:
a = [1, 2, 3]
b = ['a', 'b']
b = a
b.append(4)
print(a, b)
我的理解: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)
根据我目前的理解,我认为第 3 行 b = a
上的 link 只提供了 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
是否类似于双向 link? a
还创建了对 b
对象的引用?
我希望有人能为我解决这个困惑,如果我错了,请纠正我的想法。 谢谢。
My understanding: b is now referring to two objects, . . .
这是不正确的。一个名称不能同时与给定范围内的多个对象相关联。
b = a
将 b
与 a
关联的对象相关联。该行执行后,将没有任何内容引用 ['a', 'b']
,并且该列表应该符合垃圾回收条件,因为它不能再被使用。
不要把对象想成指针,我认为那是你困惑的根源。不是“b指向a”或“a指向b”,它与绑定到一个对象有关。我觉得看看 id
会有用
>>> a = [1, 2, 3]
>>> id(a)
1833964774216
>>> b = a
>>> id(b)
1833964774216
在这种情况下,a
和 b
都绑定到该列表。因此,列表 1833964774216
的任何变化都将反映在两个对象中。但是我可以re-assign(或re-bind)到一个完全不同的对象
>>> b = [4, 5, 6]
>>> id(b)
1833965089992
>>> b
[4, 5, 6]
这对 a
没有任何影响,因为它仍然绑定到原始列表
>>> a
[1, 2, 3]
>>> id(a)
1833964774216
让我们了解名称和对象之间的区别。在您的例子中,a 和 b 是名称,分配给 a 和 b 的列表“[1,2,3]”是对象。最初 a = [1,2,3] 并且在 a 被分配给 b 即 b=a 之后,在这种情况下 a 和 b 都绑定到同一个列表对象。这意味着您可以使用名称 a 或 b 中的任何一个来更改该列表对象的值。
这可以通过将分配给 a 的列表复制到 b 来解决,
b = a.copy()
这将创建分配给 b
的同一对象的副本