Python创建具有相同值的新对象

时间:2011-05-05 19:15:26

标签: python pass-by-value

我来自java世界,我期待以下事情

int a = valueassignedbyfunction();
int b = a;
a = a + 1; 

此后a比b大1。但是在python中,一旦a = a + 1操作完成,b就会自动增加1,因为这个b引用的是同一个对象。如何只复制a的值并将其分配给名为b的新对象?

谢谢!

6 个答案:

答案 0 :(得分:5)

假设整数,我无法重现你的问题:

>>> a = 1
>>> b = a
>>> a += 1
>>> a
2
>>> b
1

如果我们改为假设对象:

class Test(object):
...     def __init__(self, v):
...         self.v = v
...         
>>> a = Test(1)
>>> b = a.v
>>> a.v += 1
>>> print a.v, b
2 1
# No issues so far
# Let's copy the object instead
>>> b = a
>>> a.v += 1
>>> print a.v, b.v
3 3
# Ah, there we go
# Using user252462's suggestion
>>> from copy import deepcopy
>>> b = deepcopy(a)
>>> a.v += 1
>>> print a.v, b.v
4 3

答案 1 :(得分:2)

此文档可能会有所帮助:http://docs.python.org/library/copy.html

您可以使用副本库深度查看对象:

import copy
b = copy.deepcopy(a)

答案 2 :(得分:2)

我认为这里的主要困惑如下:在Java中,像

这样的行
int i = 5;

为整数分配内存并将名称i与此内存位置相关联。您可以以某种方式识别具有此内存位置及其类型的名称i,并将整个事件称为“整数变量i”。

在Python中,行

i = 5

评估右侧的表达式,这将产生一个Python对象(在这种情况下,表达式非常简单,将产生整数对象5)。赋值语句使名称i指向该对象,但名称和对象之间的关系与Java完全不同。名称始终只是对象的引用,并且可能有许多名称引用同一个对象或根本没有名称。

答案 3 :(得分:1)

我不确定你在这里看到了什么。

>>> a = 1 
>>> b = a
>>> a = a + 1
>>> b
1
>>> a
2
>>> a is b
False

Python整数是不可变的,+操作分配会创建一个值为+ 1的新对象。整数有一些奇怪的参考问题(http://distilledb.com/blog/archives/date/2009/06/18/python-gotcha-integer-equality.page),但你应该得到你期望的相同的东西爪哇

答案 4 :(得分:0)

在这里,我了解您的困境。

分配可变对象时,只是给它起了另一个名字。

 a = 1
 b = a

在这里,您只是将“ 1”命名为a和b。

要实现您期望看到的功能,您需要进行浅拷贝或深拷贝。

在此处详细了解:https://docs.python.org/2/library/copy.html

答案 5 :(得分:0)

怎么做

a = 1
b = a*1