共享引用和平等

Shared References and Equality

使用 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 的值保持不变。

希望你能这样理解:-)

正如您在第一种方法中看到的那样,它们都引用相同的 list,第二种 different.So 在第二种方式中的变化不会影响另一个。

两者的区别如下:

下面是一步一步的分析:

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):

与大多数现代动态语言的情况一样,python 中的变量实际上是引用,有点像 C 指针。这意味着当你做类似 A = B 的事情时(其中 A 和 B 都是变量),你只需让 A 指向内存中与 B.

相同的位置

在第一个示例中,您正在改变(修改)现有对象——这就是 variable_name[index/key] = value 语法所做的。 A 和 B 都继续指向同一个东西,但是这个东西的第一个条目现在是 'shrubbery',而不是 'spam'。

在第二个例子中,当你说 B = 'dog'.

时,你将 B 指向不同的(此时是新的)对象

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