2015-04-26 2 views
2

Это может показаться немного забавным, но это то, что я пытаюсь сделать: У меня есть два списка: myList1 и myList2. Я передаю эти списки функции, которая будет выполнять определенную задачу в зависимости от того, какой список она получает (т. Е. На основе имени списка, а не контента).Как получить имя списка для сравнения

def listProcessor(data): 
    if data == 'myList1': 
     perform task1 
    else: #meaning data is myList2 
     perform task 2 

Есть ли способ в Python 3, чтобы узнать название списка (или кортеж, словарь и т.д.) и сделать сравнение, как это? Очевидно, способ, которым я это делаю, не работает, поскольку он сравнивает содержимое списка «данные» с одной строкой «myList1», которая не работает! :-).

+0

uhmm ... похоже, мне нужно изучить механику публикации на этом сайте, так как окончательный текст выглядит совсем не так, как я на самом деле набрал! – lookiluke

+1

Объекты не имеют имен, они имеют только идентификаторы. Кроме того, вы выбираете очень плохой способ сделать это. – Shashank

+0

ok! Я получаю это сейчас (относительно новое для программирования на питоне). Итак, как бы я сделал это лучше? – lookiluke

ответ

2

Есть несколько способов сделать это:

  1. Вы можете создать отдельные функции, если то, что должно быть сделано для каждого список действительно полностью отдельный.

  2. Вы можете обновить функцию либо:

    1. Возьмите два списка в качестве аргумента:

      def list_processor(list1=None, list2=None): 
          if list1: 
           # do stuff for list1 
          if list2: 
           # do stuff for list2 
      
    2. Вы можете добавить дополнительный флаг, определяя, какие действия должны быть выполнены , а также установить значение по умолчанию:

      def list_processor(some_list=None, type_of_list=1): 
          if type_of_list == 1: 
           # do stuff with some_list as if it was list1 
          if type_of_list == 2: 
           # do stuff with some_list as if it was list2 
      

Вы делаете не хотите сделать то, что вы изначально предложили, по разным причинам.Одна из основных причин заключается в том, что в Python то, что вы можете назвать переменными на других языках, не является «ящиками для ввода материала» (как это обычно называют в большинстве учебников).

В переменных Python на самом деле есть только имена, указывающие на объект. Главное, что несколько имен могут указывать на один и тот же объект; который будет легко путать вашу функцию, если вы будете полагаться на списки «имя».

Вот пример:

>>> a = [1,2,3] 
>>> b = a 
>>> b.append('hello') 
>>> b is a 
True 
>>> b == a 
True 
>>> b 
[1, 2, 3, 'hello'] 
>>> a 
[1, 2, 3, 'hello'] 

В этом примере, как a и b указывают на объект же список. То, что вы делаете с a, влияет на b.

1

Итак, давайте начнем с: Вы действительно не должны этого делать. Данные - это просто данные в Python - идентификатор (например, имя, которое вы используете, чтобы говорить об этом) ничего не значит для самой программы. Это имеет смысл только программисту.

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

globals() предоставит вам словарь с ключами идентификаторов и значений, um, values, для всех объектов, находящихся в настоящее время в глобальной области. Это означает, что вы можете сделать:

def list_processor(data): 
    g = globals() 
    data_name = next((k for k,v in g.items() if v is data)) 
    if data_name == 'myList1': 
     ... # do whatever you want here 

Обратите внимание на то, что вы просматриваете ВСЁ в глобальном масштабе. Во-первых, это немой, поскольку он медленный, а во-вторых, он немой, потому что он глючит. Что делать, если myList1 не передается из глобальной области? Что, если это локальная переменная внутри функции, которая никогда не попадает в глобальную область? Теперь ваш хитрый хак не удался.

Правильный способ сделать это - выполнить какую-то интроспекцию по аргументу, передаваемому как «data». Например, если myList1 всегда имеет 8 элементов и myList2 всегда имеет 10:

def f_if_myList1(lst): 
    """Do whatever we do if we pass myList1""" 
    ... 

def f_if_myList2(lst): 
    """Do whatever we do if we pass myList2""" 
    ... 

def list_processor(data): 
    if len(data) == 8: # myList1! 
     f_if_myList1(data) 
    elif len(data) == 10: 
     f_if_myList2(data) 
    else: 
     # not sure. raise ValueError()? 
Смежные вопросы