我正在使用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'
请问能否解释一下?
我正在使用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
将 B
和 A
指向同一个列表的原因:
>>> A = ['spam']
>>> B = A
>>> A is B
True
>>>
因此,对B
所引用的列表所做的任何更改都将影响到A
所引用的列表(反之亦然),因为它们是同一个对象。
然而,第二个示例并没有修改任何内容。相反,它仅仅将名称B
重新分配给一个新值。
一旦执行了这条语句:
B = 'dog'
B
不再引用字符串'string'
,而是引用新的字符串'dog'
。同时,A
的值保持不变。
可变对象是列表,而字符串是不可变的,这就是为什么你可以改变内存地址和列表本身,但不能改变字符串的原因。
希望你能用这种方式理解它 :-)
正如你在第一种方法中看到的那样,它们都引用了同一个list
,而第二种方法则不同。因此,在第二种方式中进行的更改不会影响另一个。
在大多数现代动态语言中,Python 中的变量实际上是引用,类似于 C 指针。这意味着当您执行像 A = B
(其中 A 和 B 都是变量)这样的操作时,您只需使 A 指向与 B 相同的内存位置。
在第一个示例中,您正在就地更改(修改)现有对象 - 这就是 variable_name[index/key] = value
语法所做的事情。A 和 B 继续指向相同的东西,但是这个东西的第一个条目现在是 'shrubbery',而不是 'spam'。
在第二个示例中,当您说 B = 'dog'
时,您使 B 指向一个不同的(此时为新的)对象。
以下是这两者之间的区别:
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):