Я поднимаю вопрос по двум причинам:
1)
- импорт нотации x ++ из других языков (C ++ и Java) - простительный грех; кто никогда не был рассеянным?
- не тестирование кодов заслуживает отрицательного ответа, это правильно, потому что это означает, что не было проведено никаких тестов, чтобы попытаться получить определенное количество наблюдений, и это baaad
- однако я считаю, что желание понять понятия, касающиеся областей, пространств имен, глобальных / локальных, более похвально, чем упреки, которые нужно упрекнуть
2)
Это, безусловно, является неудовлетворительной ситуацией, когда нужно опускать голос из-за приблизительного вопроса при получении ответа с опротестованным голосом, который, по моему мнению, содержит в себе некоторые неадекватные термины. Терминология особенно важна для субъектов, в которых могут возникать противоречивые дебаты и запутанные описания.
Например, для
def f(x):
x++
return x
- Я бы не сказал, что f получает аргумент x , но f получает x в качестве аргумента.
x не увеличивается; скорее: создается другой объект со значением, являющимся результатом приращения значения начального x
f не возвращает x + 1 , возвращает новый объект с увеличенным значением
РЕДАКТИРОВАТЬ 1
# f принимает аргумент x
В вызове f(x)
я бы не сказал, что f получает аргумент x , потому что x не является аргументом в абсолютном , x «становится» аргументом только относительно функции в тот момент, когда он передается функции. Поэтому я скорее говорю, что в вызове f(x)
функция f получает x AS
аргумент.
Может случиться так, что один раз произнесет "аргумент Y" один раз, как преуменьшение для выражения "Y, рассматриваемый в момент, когда он передается в качестве аргумента функции" . Это занижение короче; но я думаю, что в точном объяснении такой простой способ выражения должен быть запрещен.
# Приращения x
Ссылаясь на код, написанный в вопросе (случай 1), это предложение неоднозначно из-за функции, записанной с параметром x : делает x обратитесь к x в функции или к x снаружи? Вы скажете, что я придирчив, но для новичка, который плохо знает модель данных и работу функций, вопрос верен. Что означает f(x)
в Python? x передается по значению или по ссылке? Возможно, что операции внутри f могут изменить x снаружи, почему бы и нет, это именно то, что обсуждается, нет? Вот почему лучше присвоить параметру f другое имя, чем любое из имен внешних объектов; Я думаю так же, как и в предыдущем предложении: в точном объяснении следует использовать только осторожные предложения и коды, чтобы избежать неясностей:
def f(N):
N += 1
return N
x = 5
x = f(x)
print x
И следует пояснить, что инструкция N += 1
запускает создание нового объекта с увеличенным значением и что локальный идентификатор N восстанавливается для этого нового объекта. И в этот момент глобальный идентификатор x все еще привязан к тому же объекту, что и до вызова.
# возвращает x + 1
f не возвращает x + 1 , возвращает новый объект, недавно назначенный N с увеличенным значением
# глобальный x не затронут
Что это значит?До этого глобальное x имеет значение 5. После этого глобальное x имеет значение 6. Во время выполнения операций внутри f глобальное x не затрагивается, это верно: это только когда новый объект (фактически его адрес ..) возвращается за пределы f , и что выполнение x = f(x)
выполняетсяэто глобальное x затронуто.Но это предложение "глобальный x не затронут" ставится после "возвращает x + 1" .Нет, правда, я ничего не понимаю в таких объяснениях.
Конец EDIT 1
.
.
Относительно второго случая
def f():
global x
x += 1
- Я предпочитаю сказать, что f не имеет аргумента, чем не имеет параметра
- Это не увеличивает глобальное значение x , оно вызываетновое присвоение глобального идентификатора x новому объекту с увеличенным значением.
EDIT 2
В этом случае невозможно использовать другойимя, отличное от x внутри функции, иначе пример будет означать другое.
def f():
global x
x += 1
x = 5
f()
print x
# f не имеет аргументов
Какого черта я написал «Я предпочитаю сказать, что у f нет аргумента, чем у него нет параметра» , чтобы прокомментировать это?Я все еще удивляюсь.Сначала я написал «Я предпочитаю сказать, что f не имеет параметра, чем не имеет аргумента» , думая об определении f .Я не знаю почему, я «исправил», изменив предложение, и результат ничего не говорит о том, что я думаю.Я полностью озадачен.
Точно, я думаю, что правильные способы выражения:
в определении функции, f -> HAS нет ПАРАМЕТРА,
в вызове f()
, f -> ПОЛУЧАЕТ нет АРГУМЕНТОВ.
# Увеличивает глобальный x
Не увеличивает глобальный x , он вызывает новое назначениеглобальный идентификатор x для нового объекта с увеличенным значением.
Конец РЕДАКТИРОВАНИЯ 2
.
Это может показаться незначительными нюансами, и яуверен, что это способ выразить вещи в сжатой форме.
Но для меня это очень важно, потому что, будучи новичком, у меня было много трудностей из-за такой неточности, чтобы понять все эти вопросысвязаны со специфической моделью данных Python, которая плохо объясняется в официальных документах Python и обсуждается в неаккуратных дискуссиях, таких какВыражение «передать по значению или передать по ссылке» для примера (что не имеет смысла в Python), в котором термины плавают справа налево и слева направо, как в море неопределенности.