Когда вы присваиваете значение имени name = 5
, вы создаете ссылку на 5
, которую вы можете использовать для доступа к идентификатору name
. Обычно, если у вас есть какой-то код с более узкой областью действия, вы можете использовать эту ссылку
def f():
print(name)
или создать локальную ссылку, используя тот же идентификатор, потенциально для несвязанного значения
def g():
name = 100
print(name)
Ключевое слово global
позволяет вместо этого манипулировать идентификатором так, как если бы вы находились в более узкой области, позволяя переназначить глобальное имя другой ссылке:
def h():
global name
name = 100
h()
print(name) # 100
Однако, когда Вы используете ссылку для создания другой ссылки, между этими двумя ссылками нет связи. Таким образом,
name = 5
l = [name]
оставляет нам две ссылки на значение 5
: одну из идентификатора name
и одну из первой позиции l
. Важно отметить, что эти две ссылки не связаны; мы можем изменить одно без изменения другого.
name = 6
print(l) # [5]
Один из способов достижения sh того, что вы хотите - это использовать коробочный тип. Это означает, что вы создаете объект, который указывает на другой объект. Все ваши ссылки могут затем указывать на первый объект (блок), и вы можете свободно изменять то, на что он указывает (объект «внутри» блока), путем обновления только одной ссылки:
class Box:
def __init__(self, value):
self.value = value
box = Box(5)
l = [box]
box.value = 10
print(l[0].value) # 10