Как добавить в глобальный список внутри функции?

#python #list #function

Вопрос:

У меня есть программа, которую я планирую расширять неоднократно, и я не хочу иметь дело с кодированием одного и того же каждый раз, когда я добавляю новый сегмент. Единственная проблема заключается в том, что одна функция, которая мне нужна, включает добавление списка, определенного вне функции. Я попытался использовать globals (), но получил синтаксическую ошибку.

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

 fruitList = [] miscList = []  newListObject = input("Enter a new object")  def listAppend(object = newListObject, fruit = fruitList):  if object in fruit:  fruitList.append(object)  else:  miscList.append(object)  listAppend()  

Это не работает, потому что miscList и fruitList являются глобальными, а функции могут получать доступ только к локальным переменным и особенно изменять их. Есть ли какие-нибудь обходные пути?

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

1. Это не изменение глобальных переменных, а скорее изменение объектов, на которые указывают глобальные переменные.

2. Кроме того, лучше не называть что-то object , поскольку это имя встроенного типа Python, который, в общем, лежит в основе всего.

3. Это действительно работает . Но он терпит неудачу по другой причине. Пожалуйста, всегда включайте полное сообщение об ошибке.

4. @juanpa.arrivillaga прав — если у вас нет этого кода в другом контексте, это работает. Это можно продемонстрировать, распечатав списки после вашего звонка listAppend .

5. Добро пожаловать в Stack Overflow. То, что вы говорите о глобалах, неверно, и я не могу воспроизвести проблему. Когда я пробую ваш код, я правильно вижу, что строка, которую я ввожу, добавляется miscList . Что касается того , почему вы «получили синтаксическую ошибку» globals() , мы можем объяснить это только в том случае, если вы покажете код, в котором вы это пробовали. Это также определенно не имеет ничего общего с «использованием globals() » — даже если бы у вас была проблема, связанная с использованием этого, это не проявилось бы как синтаксическая ошибка, потому что синтаксическая ошибка является результатом неправильного отступа вашего кода, несоответствия скобок и т. Д.

Ответ №1:

Это определенно работает на меня! Обратите внимание, что передача глобальных списков в качестве параметров функции не рекомендуется, однако ничто не мешает вам сделать это, если у вас есть особая потребность в этом. Пример, с которым я тестировал, приведен ниже.

 fruitList = ['test'] miscList = []   def listAppend(obj=None, fruit=fruitList, misc=miscList):  if obj is None:  obj = input("Enter a new object")   if obj in fruit:  fruit.append(obj)  else:  misc.append(obj)   listAppend('lol') listAppend('test')  print(fruitList) print(miscList)  

Выход:

 ['test', 'test'] ['lol']  

NB: Я переименовал параметр object в obj , потому что, как правило, не рекомендуется перезаписывать встроенный тип.