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

Pro*_*mer -2 python pass-by-value

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

int a = valueassignedbyfunction();
int b = a;
a = a + 1; 
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Sea*_*ira 6

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

>>> a = 1
>>> b = a
>>> a += 1
>>> a
2
>>> b
1
Run Code Online (Sandbox Code Playgroud)

如果我们假设对象:

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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这正是 Java 和大多数其他语言中的工作方式。这里没有什么不寻常的。 (2认同)

Exe*_*sis 5

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

您可以使用复制库来深度复制对象:

import copy
b = copy.deepcopy(a)
Run Code Online (Sandbox Code Playgroud)


Sve*_*ach 5

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

int i = 5;
Run Code Online (Sandbox Code Playgroud)

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

在 Python 中,该行

i = 5
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,对于对象,Java(以及其他几种语言)也仅存储具有所有可观察效果的引用。只是原始类型的特殊外壳有如此根本的不同。仍然+1,因为它提供了关于变量和对象模型的不错的文章。 (2认同)