У вас нет глобальной переменной. Вместо этого у вас есть локальная переменная, которую вы передаете своей функции.
Когда вы создаете переменную, вы просто создаете псевдоним, указывающий на местоположение объекта в памяти. В приведенном ниже коде мы создаем список, который является объектом и имеет строковый объект внутри него. Затем мы создаем имя mylist и указываем на место в памяти объекта списка.
mylist = [1]
Когда вы затем передаете mylist в функцию, происходит то, что функция получает копию ячейки памяти, на которую указывает mylist, и функция устанавливает свою локальную переменную, чтобы указывать на эту ячейку памяти.
Таким образом, когда вы выполняете действие, которое изменяет объект в этой ячейке памяти, это обновление будет также видно по имени переменной вне функции, поскольку обе они указывают на одну и ту же ячейку памяти.
Если, однако, вы должны переназначить что-либо на эту переменную в функции, например, создать новый список, то это не будет отражаться в переменной вне функции. Поскольку то, что на самом деле происходит, - это создание нового объекта и на него будет указана локальная переменная области видимостиэто не изменило бы адрес памяти переменной вне функции, которая все еще указала бы на исходное местоположение.
def first():
mylist = [1]
print("mylist:", mylist)
print("mylist id:", id(mylist))
second(mylist)
third(mylist)
print("mylist:", mylist)
print("mylist id:", id(mylist))
def second(second_list):
#here the local function variable second_list points to the same memory location as mylist
print("second id:", id(second_list))
#Here we change the values in this memory location. So second list is still pointing to and change the data that my list points to
#this is why mylist can see the change even though its not a global variable
second_list.append(2)
print("Second_list:", second_list)
print("second id:", id(second_list))
def third(third_list):
#here the local function variable third_list points to the same mermoy location as mylist
print("third list:", third_list)
print("third id:", id(third_list))
#here we create a new object which will have a new memory lcaotion then we point the local variable third_list at it.
#now third_list points to new memory location and not the same memory location as mylist.
third_list=[3]
print("third list:", third_list)
print("third id:", id(third_list))
first()
ниже - вывод, где вы можете видеть идентификатор памяти каждого из объектов, которые вы увидитекак они указывают на один и тот же объект, а затем в третьей функции его переназначают на новый объект в памяти.
mylist: [1]
mylist id: 2636457271880
second id: 2636457271880
Second_list: [1, 2]
second id: 2636457271880
third list: [1, 2]
third id: 2636457271880
third list: [3]
third id: 2636457271944
mylist: [1, 2]
mylist id: 2636457271880