Python создает новый объект с тем же значением - PullRequest
0 голосов
/ 05 мая 2011

Я родом из мира Java, где ожидаю следующих вещей

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

после этого a на 1 больше, чем b. Но в python b автоматически увеличивается на единицу, как только операция a = a + 1 выполнена, потому что этот b ссылается на тот же объект, что и a. Как я могу скопировать только значение a и назначить его новому объекту с именем b?

Спасибо!

Ответы [ 5 ]

5 голосов
/ 05 мая 2011

Предполагая целые числа, я не могу воспроизвести вашу проблему:

>>> 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
2 голосов
/ 05 мая 2011

Я думаю, что главная путаница здесь заключается в следующем: в Java такая строка, как

int i = 5;

выделяет память для целого числа и связывает имя i с этой ячейкой памяти. Вы можете как-то отождествить имя i с этим местом в памяти и его типом и назвать все это целой переменной i.

В Python строка

i = 5

вычисляет выражение с правой стороны, что приведет к объекту Python (в этом случае выражение действительно простое и даст целочисленный объект 5). Оператор присваивания заставляет имя i указывать на этот объект, но отношение между именем и объектом совершенно иное, чем в Java. Имена всегда являются просто ссылками на объекты, и может быть много имен, ссылающихся на один и тот же объект, или вообще без имен.

2 голосов
/ 05 мая 2011

Эта документация может помочь: http://docs.python.org/library/copy.html

Вы можете использовать библиотеку копирования для глубокой копии объектов:

import copy
b = copy.deepcopy(a)
1 голос
/ 05 мая 2011

Я не уверен, что вы видите здесь.

>>> 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),, но вы должны получить то же, что ожидали в Java

0 голосов
/ 21 февраля 2019

Я понимаю вашу дилемму, здесь.

Когда вы присваиваете изменяемый объект, вы просто даете ему другое имя.

 a = 1
 b = a

Здесь вы просто называете «1» как a и b.

Чтобы получить ожидаемую функциональность, вам потребуется сделать мелкую или глубокую копию.

Узнайте больше об этом здесь: https://docs.python.org/2/library/copy.html

...