2011-04-07 56 views
2

为什么赋值运算符没有创建右值的副本,而是引用了该值(在列表中),并且必须使用切片才能创建一个真正的副本,从而创建独立的对象在一个变化不会影响另一个。这是否与某些特定用法有关,直到现在我错过的语言?python中的参考问题

编辑:我understod的是,在C++

int a = 1; 
int b = a; 
b = 2; // does not affect a 

,所以我也认为这将是同样的道理,因为Python是用C语言开发,并将其与指针照顾它最有可能。用一些简单的代码:

int a = 1; 
/*int b = a;*/ 
int &b = a; /* what python does as I understood, if so why it does that this way?*/ 

更清楚了吗?

我问的是更多的关于这一点我应该是比较清楚的比较问题,我同意;-)

+2

请阅读“可变”结构。列表(和字典)是特殊的,因为它们是可变的。阅读完“可变”后,请**更新**您的问题以获得更具体的信息。 – 2011-04-07 11:48:01

+1

S.洛特说真话,呼吸正义。 – jathanism 2011-04-07 11:52:30

+0

Python中的变量是对象的引用。这就是它的设计。如果切片感觉很难看,那就是'copy'模块。 – 2011-04-07 11:55:00

回答

2

我最近发布了一个answer认为确切地讨论了这个问题。

+0

不错的链接和很好的解释,我的理解或多或少是正确的,所以我很高兴......+1这个 – 2011-04-07 13:11:03

+1

@Umut Tabak:在答案下是一个“勾号”,你可以点击显示你的幸福。 – 2011-04-07 13:17:36

+0

好吧:)我做到了... – 2011-04-07 13:20:17

2

在Python中,一切都可以被看作是一个参考。如果你想分配是一个副本,你总是需要把它excplicitely在你的表达

a = range(10) # create a list and assign it to "a" 
b = a # assign the object referenced by "a" to b 
a is b # True --> a and b are two references to the same object. Works with any object 
     # after b = a 
from copy import deepcopy 
c = deepcopy(a) # or c = a[:] for lists 
c is a # False 
+0

一个对象是一个命名的存储和名称是你如何引用的内存位置,这是我所知道的。从这个角度来看,a = [1,2,3],因此[1,2,3]是存储在内存中的真实对象,a是容纳此对象的容器的名称,是吗?所有?我在想的是,作业是自动进行复制,但显然它不会这样工作...... – 2011-04-07 12:26:30

+0

不,它不。 “b = a”只给存储在内存中的对象提供一个新名称。 – Simon 2011-04-07 12:47:46