共享参考和平等

时间:2015-01-04 06:04:56

标签: 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'

有人可以解释一下吗?

5 个答案:

答案 0 :(得分:4)

在第一个示例中,您修改 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的值保持不变。

答案 1 :(得分:0)

enter image description here

我希望你能用这种方式理解它: - )

正如你在第一种方法中看到的那样,它们都引用相同的list,第二种不同。所以第二种方式不会改变另一种方式。

答案 2 :(得分:0)

与大多数现代动态语言中的情况一样,python中的变量实际上是类似C指针的引用。这意味着当你执行类似A = B(其中A和B都是变量)的操作时,只需将A指向内存中与B相同的位置。

在第一个示例中,您正在改变(修改)现有对象 - 这就是variable_name[index/key] = value语法的作用。 A和B都继续指向相同的事情,但这件事现在首先是#灌木'而不是垃圾邮件'。

在第二个示例中,当您说B = 'dog'时,您将B点指向另一个(此时为新的)对象。

答案 3 :(得分:0)

可变对象是列表,而字符串是不可变的,这就是为什么您可以更改内存地址和列表本身而不是字符串的原因。

答案 4 :(得分:-2)

以下是两者之间的差异:

enter image description here

enter image description here

这是一步一步的分析:

A = ['spam']
"A points to a list whose first element, or A[0], is 'spam'."
B = A
"B points to what A points to, which is the same list."
B[0] = 'shrubbery'
"When we set B[0] to 'shrubbery', the result can be observed in the diagram.
A[0] is set to 'shrubbery' as well."
print (A):



A = 'string'
"A points to 'string'."
B = A
"B points to what A points to, which is 'string'."
B = 'dog'
"Oh look! B points to another string, 'dog', now.
So does what A points to change? No."
The result can be observed in the diagram.
print (A):