为了账号安全,请及时绑定邮箱和手机立即绑定

通过分配:Python

通过分配:Python

尚方宝剑之说 2023-05-23 16:11:59
我想理解以下代码变体:a = [1, 2, 3]b = ab.append(4)b = ['a', 'b']print(a, b)我的理解是,变量指的是一个对象,该对象包含内存中某个位置的a列表,现在指的是所指的同一个对象,通过该链接,我们在技术上追加了一个非 b。[1,2,3]ba输出:[1, 2, 3, 4] ['a', 'b']我稍微更新了代码:a = [1, 2, 3]b = ['a', 'b']b = ab.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 = ab.append(4)a.append(10)print(a, b)根据我目前的理解,我虽然第 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的对象也在哪里创建引用?如果我错了,我希望有人能为我消除这种困惑并纠正我的想法。谢谢。
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

我的理解: b 现在指的是两个对象, . . .

那是不正确的。一个名称不能同时与给定范围内的多个对象相关联。

b = a与关联的b对象关联。a该行执行后,将没有任何内容被引用['a', 'b'],并且该列表应该符合垃圾回收条件,因为它不能再被使用。


查看完整回答
反对 回复 2023-05-23
?
茅侃侃

TA贡献1842条经验 获得超21个赞

不要把对象想成指针,我认为那是你困惑的根源。这不是“b 指向 a”或“a 指向 b”,它与绑定到对象有关。我认为看看id会有用


>>> a = [1, 2, 3]

>>> id(a)

1833964774216

>>> b = a

>>> id(b)

1833964774216

在这种情况下,a和b都绑定到该列表。因此,任何要列出的突变1833964774216都会反映在两个对象中。但我可以重新分配(或重新绑定)到一个完全不同的对象


>>> b = [4, 5, 6]

>>> id(b)

1833965089992

>>> b

[4, 5, 6]

这对没有任何影响,a因为它仍然绑定到原始列表


>>> a

[1, 2, 3]

>>> id(a)

1833964774216


查看完整回答
反对 回复 2023-05-23
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

让我们了解名称和对象之间的区别。在您的例子中,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 的同一对象的副本


查看完整回答
反对 回复 2023-05-23
  • 3 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信