Python 共享引用和平等
使用Python3.4并在O'Reilly的一本书中学习示例。 示例显示:Python 共享引用和平等,python,list,equals,Python,List,Equals,使用Python3.4并在O'Reilly的一本书中学习示例。 示例显示: A = ['spam'] B = A B[0] = 'shrubbery' 运行后的结果打印一个: 'shrubbery' 'string' 现在我的想法是,A被定义,但从未改变 这个例子产生了一个不同的结果 A = 'string' B = A B = 'dog' 这是运行打印A后的结果: 'shrubbery' 'string' 有人能解释一下吗?在第一个示例中,您正在修改B引用的列表 做: B[0] =
A = ['spam']
B = A
B[0] = 'shrubbery'
运行后的结果打印一个:
'shrubbery'
'string'
现在我的想法是,A
被定义,但从未改变
这个例子产生了一个不同的结果
A = 'string'
B = A
B = 'dog'
这是运行打印A
后的结果:
'shrubbery'
'string'
有人能解释一下吗?在第一个示例中,您正在修改B
引用的列表
做:
B[0] = 'shrubbery'
告诉Python将B
引用的列表中的第一项设置为'shubbery'
的值。此外,该列表恰好与A
引用的列表相同。这是因为:
B = A
导致B
和A
的原因均指相同的列表:
>>> A = ['spam']
>>> B = A
>>> A is B
True
>>>
因此,对B
引用的列表的任何更改也将影响A
引用的列表(反之亦然),因为它们是相同的对象
但是,第二个示例没有修改任何内容。相反,它只是将名称B
重新分配给一个新值
执行此行后:
B = 'dog'
B
不再引用字符串'string'
,而是引用新字符串'dog'
。同时,A
的值保持不变。
我希望你能这样理解:——)
正如您在第一种方法中看到的,它们都引用相同的列表,第二种方法不同。因此,在第二种方法中,更改不会影响另一种方法。以下是两者之间的区别:
下面是一个逐步分析:
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都是变量)的操作时,您只需在内存中指向与B相同的位置
在第一个示例中,您正在原地变异(修改)一个现有对象,variable\u name[index/key]=value
语法就是这样做的。A和B继续指向同一个东西,但这个东西的第一个条目现在是“灌木丛”,而不是“垃圾邮件”
在第二个示例中,当您说B='dog'
可变对象是列表,而字符串是不可变的时,将B点指向另一个(此时为新的)对象,这就是为什么您可以更改内存地址和列表本身,但不能更改字符串。Python中没有“基元类型”。所有值都是对象。这纯粹是一个名称绑定的问题。请看我的答案是否正确。谢谢你指出这一点!我一直在想Java…在第二种情况下,A和B仍然是指向字符串对象的指针。他们自己没有价值观。Python中的所有变量都存储对对象的引用。措辞错误。。。让我更正一下@kindall@kindall现在呢?@NoMorePuppies我认为这是一个很好的解释,但我也认为纯粹的图形化答案在SO中是不可接受的-它们不可搜索,也不可重复,并且不尊重可访问性标准。更多关于Python内部内存模型的细节,这一切的基础,我推荐Wesley Chun在一份报告中提到的演讲。特别是第9页以后的内容正是关于这个问题的。链接到以获得更多的视听效果。