python - 共享引用和平等

标签 python list equals

使用 Python 3.4 并完成 O'Reily 书中的示例。 示例显示:

A = ['spam']
B = A
B[0] = 'shrubbery'

运行print A后的结果:

'shrubbery'

现在我的思考过程是 A 已定义但从未更改。

这个例子产生了不同的结果

A = 'string'
B = A
B = 'dog'

这是运行 print A 后的结果:

'string'

谁能解释一下?

最佳答案

在第一个示例中,您正在修改 B 引用的列表。

正在做:

B[0] = 'shrubbery'

告诉 Python 将 B 引用的列表中的第一项设置为 'shrubbery' 的值。此外,该列表恰好与 A 引用的列表相同。这是因为:

B = A

导致 BA 都引用同一个列表:

>>> A = ['spam']
>>> B = A
>>> A is B
True
>>>

因此,对 B 引用的列表的任何更改也会影响 A 引用的列表(反之亦然),因为它们是同一个对象。


然而,第二个例子没有修改任何东西。相反,它只是重新分配名称B 给一个新值。

执行此行后:

B = 'dog'

B 不再引用字符串 'string',而是引用新字符串 'dog'A 的值同时保持不变。

关于python - 共享引用和平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27762895/

相关文章:

python - 带有分层的 Test_train_split

c# - 如何检查一个对象是否等于同一类的新对象?

java - 证明 equals 与 compareTo 齐头并进

python - Django 按子类名称过滤基类

python - 正则表达式将 3 组 : 1st word, 最后一个单词和句子的其余部分

Python:我创建了 2 个列表,对其中之一进行排序,它们都得到排序

python - 从 Python 列表中搜索字符串以查找完全匹配项

list - 模式匹配 x::xs 没有在 F# 中相应地拆分列表?

java - 我应该在 JPA 实体中编写 equals() 和 hashCode() 方法吗?

python - gpg --passphrase-fd 不适用于 python 3 子进程