Функция Python использует переменные, переданные ей, а также НЕ переданные ей. В чем разница?

#python #python-3.x #function

#python #python-3.x #функция

Вопрос:

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

 x=3
y=4
def adder():
    return x   y
  

Комментарии:

1. x amp; y являются глобальными переменными. Смотрите w3schools.com/python/gloss_python_global_variables.asp

2. Это глобальные переменные — обратите внимание, что вы можете только читать из них, запись в глобальную переменную требует явного global объявления внутри функции. Ограничение заключается в том, что ваша функция может добавлять только эти две конкретные переменные; в качестве параметров вы можете вызвать функцию для добавления любых двух переменных, которые вы хотите.

3. Что значит, это работает? Вы опубликовали полный код? У меня это не работает…

4. Я пробовал это в скрипте, а не в оболочке, мой плохой

5. работает и в скрипте. просто добавьте print(adder()) внизу. 🙂

Ответ №1:

Причина, по которой ваш код работал, заключается в том, что оба x и y уже существовали как глобальные переменные. Если бы вы попробовали то же самое, только с a и b в вашей функции, ничего бы не произошло.

Помимо этого, весь смысл наличия функции заключается в том, что вы можете снабдить ее любыми числами, и она все равно будет работать. Ваш код можно заменить, print (7) и он будет делать то же самое, тогда как, если вы настроите его с параметрами, он может добавить любые 2 числа

Ответ №2:

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

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

Комментарии:

1. Но я также вижу, что редактирование параметров, переданных в функцию, также влияет на глобальную переменную, такую как список.

2. Я не понимаю, что вы под этим подразумеваете.

3. Скажем, список mylist = [1,2,3] . Вы создаете функцию, в которую передан mylist , добавляет 4. После запуска функции исходный mylist теперь имеет 4. Похоже, что параметр, который вы ему передали, был указателем на глобальное значение, а не его копией. Таким образом, кажется, что независимо от того, передаете вы параметр или нет, он работает с глобальными значениями.

4. Обновление: я нашел свой ответ… функции по умолчанию изменяют глобальные значения переданных им параметров, если они изменчивы.

5. Это артефакт передачи по ссылке. Если вы передаете список или dict функции, то на самом деле эта функция получает ссылку, с помощью которой она может изменять объект, на который ссылается. Независимо от того, является ли переданный объект глобальным или локальным в области видимости вызывающего объекта или даже литералом, хотя изменение списка литералов не имеет видимого эффекта в контексте вызова.