2016-08-24 383 views
3

它被写成here Python具有原子和引用对象类型。原子对象是:int,long,complex。 当分配原子对象时,它的值被复制,当分配引用对象时,它的引用被复制。python原子数据类型

我的问题是: 为什么然后,当我做的代码波纹管我得到'真'?

a = 1234 
b = a 
print id(a) == id(b) 

在我看来,我不复制价值,我只是复制引用,不管它是什么类型。

+7

那页错了。 – vaultah

+5

在Python中,简单赋值('name = something')永远不会创建副本。请参阅[Ned Batchelder](http://stackoverflow.com/users/14343/ned-batchelder)[关于Python名称和值的事实和神话](http://nedbatchelder.com/text/names.html)。 –

+1

Python只有引用。更有趣的是他们是否引用了可变或不可变对象。 – spectras

回答

4

Python中的赋值(绑定)从不复制数据。它始终复制对被绑定值的引用。

解释器计算右侧的值,左侧通过引用将其绑定到新值。如果右侧的表达式是现有值(换句话说,如果没有运算符需要计算其值),那么左侧将是对同一对象的引用。

a = b 

执行后,

a is b 

将永远是真实的 - 这是分配在Python中是如何工作的。容器也是如此,因此x[i].some_attribute = y将使x[i].some_attribute is y为真。

断言Python的原子类型和引用类型对我来说似乎没有帮助,如果不是简单的不真实。我会说它有原子类型和容器类型。容器就像列表,元组,字典和具有私有属性的实例(第一次近似)。

+0

感谢您的回答! –

0

int类型是不可变的。 你看到的是数字1234的参考,并且永远不会改变。

像列表可变对象,字典,你可以使用

import copy 
a = copy.deepcopy(b) 
0

其实像@spectras说,有只引用,但也有像float S,int S,tuple小号不可变对象。对于不可变的对象(除了内存消耗),只要传递引用或创建副本就没有关系。

的解释,甚至做了一些优化,利用数以相同的值可以互换制定检查身份证号码有趣的,因为例如,对于

a=1 
b=1 
c=2/2 
d=12345 
e=12345*1 

a is b是真实的,a is c也是如此,但d is e是假的(==按预期正常工作)

不可变的对象是原子的方式改变他们是线程安全的,因为你实际上并没有改变对象本身,而只是在一个变量(这是线程安全)中添加一个新的引用。