Почему я не могу передать прямую ссылку на значение словаря в функцию? - PullRequest
1 голос
/ 13 мая 2009

Ранее сегодня я задал вопрос о передаче значений словаря в функцию. Хотя теперь я понимаю, как выполнить то, что я пытался выполнить, почему вопрос (который не был задан) так и не был дан ответ. Так что мое продолжение почему я не могу

def myFunction(newDict['bubba']):
    some code to process the parameter

Это просто потому, что правила парсера этого не допускают? Я гуглил для + Python + function + «допустимые параметры» и не нашел ничего полезного, поэтому буду признателен за любую информацию.

Я упрощаю то, что происходит. У меня есть словарь, который структурирован как

myDict={outerkey1:(innerkey1:value,innerkey2:value,. . .innerkeyn:value),outerkey2:(innerkey1:value,innerkey2:value,. . .innerkeyn:value),. . .}

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

 def myFunction(outerkey,myDict[outerkey]):

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

Ответы [ 3 ]

6 голосов
/ 13 мая 2009

Да, парсер отклонит этот код.

Списки параметров используются в определениях функций для привязки идентификаторов внутри функции к аргументам, которые передаются извне при вызове .

Поскольку newDict['bubba'] не является допустимым идентификатором, это не имеет никакого смысла - вам нужно предоставить его в качестве аргумента вызова вместо параметра функции, поскольку параметры функции могут быть только идентификаторами.

Поскольку вы, кажется, интересуетесь формальной грамматикой , вот соответствующие части:

funcdef ::= 
             [decorators] "def" funcname "(" [parameter_list] ")"
              ":" suite

parameter_list ::= 
                 (defparameter ",")*
                (~~"*" identifier [, "**" identifier]
                 | "**" identifier
                 | defparameter [","] )

defparameter ::= 
             parameter ["=" expression]

identifier ::= 
             (letter|"_") (letter | digit | "_")*

Фактически, конструкция, которую вы пытаетесь использовать в качестве идентификатора, является подпиской:

subscription ::= 
             primary "[" expression_list "]"
2 голосов
/ 13 мая 2009

Вы можете передавать только ссылки на объекты.

a = { 'a' : 123, 'b' : [ 1, 2, 3 ] }

def f(dictionary_value):
    dictionary_value.append(4)

f( a['b'] )

Делает то, что вы ожидаете. Элемент словаря a['b'] передается «по ссылке» в функцию f, которая обновляет элемент словаря.

2 голосов
/ 13 мая 2009

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

def f(x):
    y = x * x
    print "x squared is", y

Сама по себе эта функция ничего не делает (т.е. ничего не печатает). Если вы поместите это в исходный файл и запустите его, ничего не будет выведено. Но тогда, если вы добавите:

f(5)

вы получите вывод "х в квадрате 25". Когда Python встречает имя функции, за которым следуют фактические параметры, он подставляет значение (я) этих фактических параметров для формальных параметров в определении функции. В этом случае формальный параметр называется x. Затем Python запускает функцию f со значением x, равным 5. Теперь большим преимуществом является то, что вы можете снова использовать ту же функцию с другим значением:

f(10)

печатает "х в квадрате 100".

Надеюсь, я правильно понял источник вашей трудности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...