Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 共享引用和平等_Python_List_Equals - Fatal编程技术网

Python 共享引用和平等

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] =

使用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] = '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页以后的内容正是关于这个问题的。链接到以获得更多的视听效果。