Просматривая список и заменяя строку в Python - PullRequest
0 голосов
/ 19 апреля 2020

Я новичок в python и хочу создать простую функцию инвентаря для моей текстовой игры. Я хочу, чтобы функция go прошла через список (инвентарь) и заменила первую строку с заголовком «пусто» на элемент.

Вот что у меня есть:

Inventory =["Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty"]

def inventory(item):
    for line in Inventory:

Это немного Я знаю. Таким образом, в основном, когда я ввожу «элемент» в функцию, я хочу, чтобы функция go прошла по списку, нашла первую «пустую» строку и заменила ее на «элемент», а затем остановилась. Надеюсь, что это не слишком большой вопрос.

Ответы [ 4 ]

1 голос
/ 19 апреля 2020

Я думаю, что лучше, если вы измените список, не передавая его в функцию без возврата. Это включает в себя python изменяемая переменная , ссылка и scope .

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

Например:

def temp(data):
    data.clear()

data1 = [1,2,3]
temp(data1)
print(data1) 

# output:
[] 

Короткая версия состоит в том, что переменные python ссылаются по их идентификатору и передают список как есть (просто передавая имя, как показано в примере) в функции означает, что теперь список внутри функции и за ее пределами имеет один и тот же идентификатор, что означает, что изменение, выполненное внутри функции, повлияет на список вне функции. (такое же поведение при передаче списка в несколько разных функций, теперь каждая функция модифицирует этот список)

Кроме того, в зависимости от того, как вы изменяете список, иногда может быть сгенерирован новый идентификатор, который может испортить logi c еще больше.

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

ps. передача копии списка означает, что вы дублируете значение и занимает больше памяти, но это действительно не так важно, если у вас нет списка в 1 ГБ. Если это так, то передача его без .copy () и использование нового значения из функции return также работает.

def process_list(data):
    # code provided by other answers 
    return data 

inventory = process_list(inventory.copy())

Таким образом, более понятно, как изменяется значение

1 голос
/ 19 апреля 2020

Для этого не нужно использовать al oop.

try:
    empty_pos = Inventory.index("Empty")
except ValueError:
    print("No empty slots!")
else: 
    Inventory[empty_pos] = item
1 голос
/ 19 апреля 2020

Для этого вы можете сказать:

Inventory = ["Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty"]
def inventory(item): 
   for i in range(len(Inventory)): 
       if Inventory[i] == 'Empty': 
          Inventory[i] = item 
          break; 

В качестве альтернативы вы можете сделать это в одну строку и сказать:

def inventory(item): 
    if 'Empty' in Inventory: 
       firstEmptyIndex = Inventory.index('Empty')
       Inventory[firstEmptyIndex]  = item 
0 голосов
/ 19 апреля 2020

вот код, который предполагает, что в инвентаре есть хотя бы одна «пустая» строка

Inventory = ["Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty"]
def inventory(item):
    Inventory[Inventory.index("Empty")] = item

Без предположения

Inventory = ["Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty"]
def inventory(item):
    try:
        Inventory[Inventory.index("Empty")] = item
    except ValueError:
        pass # since you didn't mention what to do if "Empty" does not exist

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