Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/88: Рейтинг темы: голосов - 88, средняя оценка - 4.86
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491

Передача переменной в функцию по "ссылке"

27.08.2020, 22:46. Показов 17174. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер,

Начинаю знакомиться с питоном.
Насколько я понял из гугла, передача переменной из функции в функцию осуществляется путем копирования ссылки на эту переменную. Получается, что сами данные из переменной не копируются и это позволяет быстро "передавать" данные из одной функции в другую не важно какого размера эта переменная так?

Теперь я пытаюсь это проверить. Я в PyCharm пишу:
Python
1
2
3
4
5
6
7
8
def add(val):
    val = 4
 
 
if __name__ == '__main__':
    val  = 1
    add(val)
    print(val) # результат 1
И у меня не получается изменить эту переменную на число 4. Она как была 1 так и осталась равной 1
В тоже время на СтакОверфлоу что с передачей списков все работает
Помогите пожалуйста разобраться
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.08.2020, 22:46
Ответы с готовыми решениями:

Передача переменной по ссылке в функцию
Добрый вечер! Как передать переменную a по ссылке, не по значению? fun change(a:Int){ a=150 } fun main() { var a =...

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

Передача переменной по ссылке
До меня не доходит, где ошибка. Пробовал разные варианты. GET точно не пустой. Строчкой выше в коде echo выводит его значение. Но по ссылке...

9
Почетный модератор
 Аватар для ildwine
6201 / 2963 / 1300
Регистрация: 04.03.2013
Сообщений: 5,797
Записей в блоге: 1
27.08.2020, 22:59
Python
1
2
3
4
5
6
7
8
9
def add(val):
    val = 4
    return val
 
 
if __name__ == '__main__':
    val = 1
    val = add(val)
    print(val)  # результат 4
1
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
27.08.2020, 23:04  [ТС]
ildwine, спасибо, я проглядел про return

Получается вышеизложенное мое понимание о передаче переменной ошибочно?
0
Почетный модератор
 Аватар для ildwine
6201 / 2963 / 1300
Регистрация: 04.03.2013
Сообщений: 5,797
Записей в блоге: 1
27.08.2020, 23:11
Лучший ответ Сообщение было отмечено Kerim_Geophysic как решение

Решение

Kerim_Geophysic, неизменяемые (immutable) объекты передаются по значению, изменяемые (mutable) - по ссылке.
К неизменяемым относятся: числовые данные (int, float, complex), символьные строки (str), кортежи (tuple).
К изменяемым относятся: списки (list), множества (set), словари (dict).
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.08.2020, 23:13
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
о передаче переменной ошибочно?
Ты не меняешь список - ты создаешь новую переменную и присваиваешь ей число.
Изменение по ссылке (а в Python все по ссылке) работает по другому. Ты можешь изменять список, то есть менять внутри него значения.


Python
1
2
3
4
5
6
7
8
9
>>> arr = [1,2,3]
 
>>> def add(val):
    val[0]=4
 
>>> add(arr)
>>> arr
[4, 2, 3]
>>>
Про возможность мутабельности того или иного типа написали выше.
1
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
27.08.2020, 23:24  [ТС]
ildwine, Garry Galler, понял, спасибо большое!
А numpy arrays (я пока из не использовал, типа матрицы) это изменяемые или неизменяемые?
Обычно где это посмотреть, как то пишут про это в документации?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.08.2020, 23:40
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
Обычно где это посмотреть, как то пишут про это в документации?
https://docs.python.org/3/reference/datamodel.html

Цитата Сообщение от ildwine Посмотреть сообщение
неизменяемые (immutable) объекты передаются по значению, изменяемые (mutable) - по ссылке.
Не совсем так. В Python механизм называется Call By Object Reference. И так как в Python все есть объект - все передается по ссылке (даже числа и строки, что легко проверить через id). Но при передаче неизменяемых объектов передача действует как вызов по значению, неизменяемых - как вызов по ссылке.

Добавлено через 43 секунды
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
А numpy arrays
Естественно изменяемые. Иначе зачем бы они были нужны. По сути это обычные динамические Си массивы.
2
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
27.08.2020, 23:44  [ТС]
Garry Galler, спасибо большое за разъяснение!
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
28.08.2020, 15:45
Kerim_Geophysic, У Вас просто не понимание, что такое переменные в питоне. В отличие от некоторых других языков, переменные в питоне не содержат значения, в том виде, в котором мы привыкли это понимать . Когда мы говорим о значении переменной, то это разговорное упрощение, для сокращения излагаемого текста. В двух словах.
На самом деле в переменную, с помощью инструкции присваивания "=" помещается ссылка на область оперативной памяти, где по определенному адресу располагается некоторый объект питона. Поэтому переменные не передаются, а передаются объекты через переменные и через присвоенные им ссылки на объекты.
Долго все это объяснять. Читайте Лутц М. Изучаем Python (том 1, 5-е издание, 2019) Глава 6. "Кратко о динамической типизации"
Кроме этого в Вашем примере еще одна тема, которую нужно знать. "Области переменных" . Переменные внутри функции и снаружи ее, это разные переменные.
Python
1
2
    val  = 1
    add(val)
Здесь одна переменная val, имеющая свою ссылку на 1.
Python
1
2
def add(val):
    val = 4
А здесь совсем другая переменная val, которой в заголовке функции идет не явное присвоение ссылки на объект 1, а внутри функции в нее помещается ссылка уже на объект 4. Но эта переменная val никак не влияет на переменную val, которая снаружи. Поэтому переменная val снаружи функции продолжает ссылаться на объект 1.
Информацию об областях переменных Вы можете почитать в той же книге, в главе 17. "Области видимости".

Добавлено через 13 минут
Kerim_Geophysic, В принципе Garry Galler, Вам уже объяснил, я просто дополнил, где еще Вы можете об этом почитать.
1
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
28.08.2020, 19:36  [ТС]
Viktorrus, спасибо за дополнение
на днях посмотрю книгу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2020, 19:36
Помогаю со студенческими работами здесь

Передача переменной по ссылке
Добрый день. У меня имеется неограниченное число ссылок (1,2,3,4), в зависимости от того на какую ссылку нажмет человек мне необходимо...

Передача переменной по ссылке
Отправляю переменную при нажатии на ссылку следующим образом: <a href="http://localhost/index.php?z=6">Ссылка</a> все...

Передача значения переменной по ссылке
Есть событие, которое происходит в методе someMethod, при выполнении которого программа вылетает. Методу someMethod нужно получить...

Передача переменной по ссылке в обработчик событий
Здравствуйте! Помогите, пожалуйста Создала класс: class TheTagPanel: StackPanel Конструктор получает по ссылке лист public...

Передача переменной по ссылке в другой класс
Здравствуйте. Собственно сабж. Имеем первый класс public class Tmp1 { public int i=10; public static Tmp2 Tmp; .....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru