Подтвердить что ты не робот

Python: копия переменной

Есть ли способ сделать копию переменной, чтобы при изменении значения переменной 'a' она копировала себя в переменную 'b'?

Пример

a='hello'

b=a     #.copy()  or a function that will make a copy

a='bye'

# Is there a way to make 
# 'b' equal 'a' without 
# doing 'b=a'

print a
print b

У меня возникла проблема с использованием библиотеки Tkinter, в которой у меня есть контрольная кнопка, которая была сохранена в списке, и я пытаюсь получить переменную, которая у нее есть.

Но для достижения этой переменной требуется 5 строк кода.

Есть ли способ сохранить копию переменной, которая изменяется при изменении переменной checkbutton?

4b9b3361

Ответ 1

Вы изучаете, как Python занимается ссылками. Назначение просто привязывает ссылку к объекту с правой стороны. Итак, это несколько тривиально:

a = 'foo'
b = a
print b is a  #True -- They *are the same object*

Однако, как только вы это сделаете:

b = 'bar'
b is a  #False -- they're not longer the same object because you assigned a new object to b

Теперь это становится действительно интересным с объектами, которые изменяются:

a = [1]
b = a
b[0] = 'foo'
print a  #What?? 'a' changed?

В этом случае a изменяется, потому что b и a ссылаются на один и тот же объект. Когда мы делаем изменение на b (что мы можем сделать, так как оно изменено), это же изменение наблюдается в a, потому что это тот же объект.

Итак, чтобы ответить на ваш вопрос, вы не можете сделать это напрямую, но вы можете сделать это косвенно, если вы использовали изменяемый тип (например, список) для хранения фактических данных, которые вы переносите.


Это очень важно понять при работе с кодом Python, и это не так, как работает много языков, поэтому стоит подумать об этом/исследовать, пока вы действительно не поймете это.

Ответ 2

Короче говоря, с простыми присваиваниями значения вы не можете этого сделать. Как вы видели:

a=4
b=a
a=5

>>> print b
4

Однако, с изменяемыми объектами, такими как списки, вы можете это сделать. Таким образом:

a=[1]
b=a
a.append(2)

>>> print a
[1,2]
>>> print b
[1,2]

Ответ 3

В зависимости от того, что вы хотите сделать, вы можете проверить модуль weakref.

Это позволяет вам иметь первичный объект, а затем несколько копий, которые станут None, как только основной объект исчезнет.