我来自 java 世界,我期待以下事情
int a = valueassignedbyfunction();
int b = a;
a = a + 1;
在此之后 a 比 b 大 1。但是在 python 中,一旦 a = a + 1 操作完成, b 就会自动增加一,因为这个 b 引用的是与 a 相同的对象。如何仅复制 a 的值并将其分配给名为 b 的新对象?
谢谢!
我来自 java 世界,我期待以下事情
int a = valueassignedbyfunction();
int b = a;
a = a + 1;
在此之后 a 比 b 大 1。但是在 python 中,一旦 a = a + 1 操作完成, b 就会自动增加一,因为这个 b 引用的是与 a 相同的对象。如何仅复制 a 的值并将其分配给名为 b 的新对象?
谢谢!
Assuming integers, I cannot reproduce your issue:
>>> a = 1
>>> b = a
>>> a += 1
>>> a
2
>>> b
1
If we assume objects instead:
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
我认为这里的主要混淆如下:在Java中,像这样的一行
int i = 5;
为整数分配内存并将名称i
与此内存位置相关联。i
您可以通过此内存位置及其类型以某种方式识别名称,并将整个事物称为“整数变量i
”。
在 Python 中,该行
i = 5
计算右侧的表达式,这将产生一个 Python 对象(在这种情况下,表达式非常简单,将产生整数对象5
)。赋值语句使名称i
指向该对象,但名称与对象之间的关系与 Java 中的关系完全不同。名称始终只是对对象的引用,并且可能有许多名称引用同一个对象或根本没有名称。
该文档可能会有所帮助:http ://docs.python.org/library/copy.html
您可以使用复制库来深度复制对象:
import copy
b = copy.deepcopy(a)
我不确定你在这里看到了什么。
>>> a = 1
>>> b = a
>>> a = a + 1
>>> b
1
>>> a
2
>>> a is b
False
Python 整数是不可变的,+ 操作分配创建一个新对象,其值为 a+1。整数有一些奇怪的参考问题(http://distilledb.com/blog/archives/date/2009/06/18/python-gotcha-integer-equality.page),但你应该得到你所期望的相同的东西爪哇
怎么办
a = 1
b = a*1
我明白你的困境,在这里。
当您分配一个可变对象时,您只是给它另一个名称。
a = 1
b = a
在这里,您只是将“1”命名为 a 和 b。
要实现您期望看到的功能,您需要进行浅拷贝或深拷贝。