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

Может быть, вы можете попробовать этот формат:

=IF((AND(Form Responses 1!B2:B=A7,Form Responses 1!E2:E="John Smith")), Form Responses 1!F2:F,"")
167
задан Aran-Fey 25 September 2018 в 17:17
поделиться

6 ответов

Некоторые ответы содержат слово "копия" в контексте вызова функции. Я нахожу это сбивающим с толку.

Python не копирует объекты , Вы передаете во время вызова функции когда-либо .

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

Объекты могут быть изменяемыми (как списки) или неизменными (как целые числа, строки в Python). Изменяемый объект можно измениться. Вы не можете изменить имя, просто можно связать его с другим объектом.

Ваш пример не приблизительно объемы или пространства имен , это - приблизительно именование и привязка и переменчивость объекта в Python.

def f(n, x): # these `n`, `x` have nothing to do with `n` and `x` from main()
    n = 2    # put `n` label on `2` balloon
    x.append(4) # call `append` method of whatever object `x` is referring to.
    print('In f():', n, x)
    x = []   # put `x` label on `[]` ballon
    # x = [] has no effect on the original list that is passed into the function

Вот хорошие изображения на различие между переменными на других языках и именами в Python .

195
ответ дан Aran-Fey 23 November 2019 в 21:00
поделиться

У Вас уже есть много ответов, и я широко соглашаюсь с J.F. Sebastian, но Вы могли бы найти это полезным как ярлык:

Любое время Вы видите varname = , Вы создаете новый привязка имени в объеме функции. Независимо от того, что значение varname было связано с тем, прежде чем будет потерян в этом объеме .

Любое время Вы видите varname.foo() , Вы называете метод на varname. Метод может изменить varname (например, list.append). varname (или, скорее объект, что varname имена) может существовать больше чем в одном объеме, и так как это - тот же объект, любые изменения будут видимы во всех объемах.

[отмечают, что global ключевое слово создает исключение к первому случаю]

15
ответ дан Ethan Furman 23 November 2019 в 21:00
поделиться

f на самом деле не изменяет значение x (который всегда является той же ссылкой на экземпляр списка). Скорее это изменяется эти содержание из этого списка.

В обоих случаях, копия ссылки передается функции. В функции,

  • n присвоен новое значение. Только ссылка в функции изменяется, не та снаружи.
  • x не становится присвоенным новое значение: ни ссылка внутри, ни вне функции не изменяется. Вместо этого x ’s значение изменяется.

и Начиная с x внутренняя часть функция и снаружи относится к тому же значению, оба видят модификацию. В отличие от этого, n внутренняя часть функция и снаружи относится к [1 111] отличающийся , значения после n были повторно присвоены в функции.

13
ответ дан Konrad Rudolph 23 November 2019 в 21:00
поделиться

Я переименую переменные для сокращения беспорядка. n-> nf или nmain. x -> xf или xmain:

def f(nf, xf):
    nf = 2
    xf.append(4)
    print 'In f():', nf, xf

def main():
    nmain = 1
    xmain = [0,1,2,3]
    print 'Before:', nmain, xmain
    f(nmain, xmain)
    print 'After: ', nmain, xmain

main()

при вызове функции f время выполнения Python делает копию xmain и присваивает его [1 110] xf и так же присваивает копию nmain к [1 112] nf.

В случае [1 113] n, значение, которое копируется, равняется 1.

В случае [1 114] x значение, которое копируется, не литеральный список [0, 1, 2, 3] . Это ссылка к тому списку. xf и xmain указывает на тот же список, поэтому когда Вы изменяете xf, Вы также изменяете xmain.

, Если, однако, необходимо было записать что-то как:

    xf = ["foo", "bar"]
    xf.append(4)

Вы нашли бы, что xmain не изменился. Это вызвано тем, что, в строке xf = ["нечто", "панель"] у Вас есть изменение xf для указания на новый список. Любые изменения, которые Вы вносите в этот новый список, не будут иметь никаких эффектов на список что xmain неподвижные точки к.

Hope, которая помогает. :-)

6
ответ дан Pitarou 23 November 2019 в 21:00
поделиться

ItВґs, потому что список является изменяемым объектом. YouВґre не установка x к значению [0,1,2,3], youВґre определение маркировки к объекту [0,1,2,3].

необходимо объявить функцию f () как это:

def f(n, x=None):
    if x is None:
        x = []
    ...
2
ответ дан Luiz Damim 23 November 2019 в 21:00
поделиться

n является (неизменным) интервалом, и копия передается функции, таким образом, в функции Вы изменяете копию.

X (изменяемый) список, и копия , указатель передается o функция так x.append (4) изменения содержание списка. Однако Вы, Вы сказали, что x = [0,1,2,3,4] в Вашей функции, не измените содержание x в основном ().

2
ответ дан Jason Coon 23 November 2019 в 21:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: