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, где у меня есть checkbutton, которая была сохранена в списке, и я пытаюсь получить переменную, которую она содержит.

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

есть ли способ держать копию переменная, которая меняется, когда checkbutton переменная изменяется?

5 ответов


вы изучаете, как 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

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

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

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

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


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


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

a=4
b=a
a=5

>>> print b
4

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

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

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

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

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


вы спрашиваете, можно ли создать ссылку на переменную и удерживать другую переменную. Нет, это невозможно. См., например,создать ссылку на переменную (аналогично PHP "=&")?


существует уродливый способ создать независимую копию простой переменной через временный список:

a = 6; 
b = [a][0]