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

Posted

技术标签:

【中文标题】Python创建具有相同值的新对象【英文标题】:Python create new object with the same value 【发布时间】:2011-08-19 15:56:47 【问题描述】:

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

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

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

谢谢!

【问题讨论】:

我认为你在这里错了。整数对象在 Python 中是不可变的。它们无法更改。 【参考方案1】:

干吗?

a = 1
b = a*1

【讨论】:

【参考方案2】:

我明白你的困境,在这里。

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

 a = 1
 b = a

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

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

在此处了解更多信息:https://docs.python.org/2/library/copy.html

【讨论】:

我认为这是错误的,根据 Sean、Sven 和 dfb 的回答,Python 中的整数是不可变的,您只能在可变对象上使用复制。【参考方案3】:

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

int i = 5;

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

在 Python 中,行

i = 5

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

【讨论】:

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

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

>>> 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

【讨论】:

请注意,这正是它在 Java 和大多数其他语言中的工作方式。这里没有什么不寻常的。 @delnan:在 C++ 中,b = a 默认创建用户定义类的副本(除非您重载赋值运算符)。 @Sven:是的,但是 C++ 在广泛使用的高级语言中相当独特(在几个领域,不仅在这里)。例如,Java、C#、VB.NET、Ruby 以及可能许多其他具有类似语义的语言。诚然,在我的第一条评论中应该是s/most/many/,但仍然适用于 OP。【参考方案5】:

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

>>> 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),但你应该得到你所期望的相同的东西爪哇

【讨论】:

【参考方案6】:

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

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

import copy
b = copy.deepcopy(a)

【讨论】:

我认为这是错误的,根据 Sean、Sven 和 dfb 的回答,Python 中的整数是不可变的,您只能在可变对象上使用复制。

以上是关于Python创建具有相同值的新对象的主要内容,如果未能解决你的问题,请参考以下文章

打字稿:创建具有相同键但不同值的对象

python 内建方法fromkeys()创建一个具有相同元素值的字典

基于字典键创建具有值的新列

根据 SQL Server 中的最新日期创建具有过滤值的新视图的最佳方法是啥?

在 str.split 操作后创建具有最后 2 个值的新列

根据给定的系列创建具有 0 和 1 值的新数据框列 [重复]