Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 30, 2019 15:26:56

GIGABYTE_NUM_2
Зарегистрирован: 2019-04-22
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция не меняет глобальные переменные

Трудно сформулировать суть проблемы.

В общем, хочу чтобы функция могла менять значения глобальной переменной согласно заданным аргументам, среди которых одновременно находится сам идентификатор переменной (он бывает разным, зависимо от обстоятельств).

 def my_func(var, act):
    global ############# здесь я перечислил все глобальные переменные, которые могут быть изменены ######################
    if var >= 0 and act == "pls":
        
        var += 1
    elif var >= 1 and act == "mns":
        
        var -= 1
    elif var == 25 and act == "pls":
        None

К сожалению, глобальная переменная не меняется. Код работает вхолостую. Что тут не так?

Офлайн

#2 Апрель 30, 2019 17:15:43

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Функция не меняет глобальные переменные

Параметры методов создаются как локальные переменные, насколько я знаю. Т.е. var += 1 изменяет локальную переменную, значение которой передано в виде параметра, а не саму передаваемую переменную. Т.е. как-то так

 def my_func(var, act): # созданы переменные var и act, существующие внутри метода
    global  ############# здесь я перечислил все глобальные переменные, которые могут быть изменены ######################
    if var >= 0 and act == "pls":
        var += 1 # изменение локальной переменной - присвоение новой ссылки 
        
x = 100
my_func(x, "pls") # передача ссылки на объект 100, а не на переменную х
print(x) # 100

Офлайн

#3 Апрель 30, 2019 18:06:51

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Функция не меняет глобальные переменные

Egorro13
my_func(x, “pls”) # передача ссылки на объект 100, а не на переменную х
нет, учите матчасть, в частности в области изменяемых и не изменямых типов данных в питоне

GIGABYTE_NUM_2
сама задача у вас .. ну скажем врядли правильно построена. Но это долго объяснять - давайте сделаем проще. Почему бы вам не завести 1 глобальный словарь, ключами которого были бы ваши “переменные”. Тогда можно передавать в функцию его и ключ (ваш “идентификатор переменной”) который надо изменить



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Апрель 30, 2019 18:26:52

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Функция не меняет глобальные переменные

JOHN_16
нет, учите матчасть, в частности в области изменяемых и не изменямых типов данных в питоне
Не очень понял, а при чем тут изменяемость типов, если речь о передаче параметров? Если в качестве var будет передана ссылка на изменяемый объект типа списка, то присвоение var = list(('new', ‘list’)) точно так же присвоит ссылку на новый объект переменной метода и никак не затронет ни исходный объект, ни переменную, которая на него ссылалась и передавалась при вызове как параметр метода. Но это не означает, что список вдруг станет неизменяемым объектом - только то, что параметр внутри метода и переменная, использованная при вызове - не одно и то же.

Отредактировано Egorro13 (Апрель 30, 2019 18:33:11)

Офлайн

#5 Апрель 30, 2019 19:19:25

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Функция не меняет глобальные переменные

Egorro13
а я ничего не говорил про присваивание. Внимательно смотрите что я процитировал. Аргументы передаются в функции либо по значению, либо по ссылке. Это стандартная терминология от которой нету смысла уходить в сторону. В том примере что написали вы, а именно “передача ссылки на объект 100” формулировка звучит плохо. Если бы там был бы список, то звучало бы все то же самое, а смысл был бы совершенно другой



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Апрель 30, 2019 20:42:13

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Функция не меняет глобальные переменные

JOHN_16
Egorro13а я ничего не говорил про присваивание. Внимательно смотрите что я процитировал. Аргументы передаются в функции либо по значению, либо по ссылке. Это стандартная терминология от которой нету смысла уходить в сторону. В том примере что написали вы, а именно “передача ссылки на объект 100” формулировка звучит плохо. Если бы там был бы список, то звучало бы все то же самое, а смысл был бы совершенно другой
Понял, о чем речь, спасибо. В данном случае я имел в виду, что значением переменной является ссылка на объект, а не так давно при изучении основ вроде попадалось, что в Питоне все значения являются объектами, включая байты, в отличие от пока еще более привычной Явы, где по значению передаются примитивы, по ссылке - объекты классов…

Офлайн

#7 Апрель 30, 2019 21:51:08

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Функция не меняет глобальные переменные

Поэтому я и сказал что нужно учить матчасть. В питоне все объект. Переменная это ссылка на объект. Переменная это не ссылка участок памяти. Привычного понятия указателя в питоне нет. В питоне нету примитивов и сложных объектов. В питоне есть объект. Объекты бывают изменяемые и не изменяемые. Аргументы функций передаются по ссылке. По ссылке есть объект. Объекты, как мы уже знаем, в аспекте типов данных бывают изменяемые и не изменяемые. Нельзя передать переменную типа int в функцию так, что бы она была изменяемая. Потому что не метод передачи влияет на возможность изменить объект, а сам объект.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#8 Апрель 30, 2019 22:15:34

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Функция не меняет глобальные переменные

JOHN_16
Поэтому я и сказал что нужно учить матчасть. В питоне все объект. Переменная это ссылка на объект. Переменная это не ссылка участок памяти. Привычного понятия указателя в питоне нет. В питоне нету примитивов и сложных объектов. В питоне есть объект. Объекты бывают изменяемые и не изменяемые. Аргументы функций передаются по ссылке. По ссылке есть объект. Объекты, как мы уже знаем, в аспекте типов данных бывают изменяемые и не изменяемые. Нельзя передать переменную типа int в функцию так, что бы она была изменяемая. Потому что не метод передачи влияет на возможность изменить объект, а сам объект.
И как все это противоречит изначальному утверждению, что в метод была передана взятая из переменной ссылка на объект 100, а не само значение 100 и не ссылка на переменную, хранящую значение или ссылку на него?

Офлайн

#9 Апрель 30, 2019 22:22:22

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Функция не меняет глобальные переменные

Сам факт подобной формулировки выдает не понимание=) потому что с практической стороны никто так не говорит - это бессмысленно, если ты пытаешься кому то что то объяснить.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#10 Апрель 30, 2019 22:35:37

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Функция не меняет глобальные переменные

JOHN_16
Сам факт подобной формулировки выдает не понимание потому что с практической стороны никто так не говорит - это бессмысленно, если ты пытаешься кому то что то объяснить.
Спасибо, постараюсь запомнить))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version