如何获取列表名称以进行比较

时间:2015-04-26 04:18:03

标签: python

这可能听起来有点滑稽,但这是我想要做的: 我有两个列表:myList1myList2。我将这些列表传递给一个函数,该函数将根据它接收的列表执行特定任务(即,基于列表的名称,而不是内容)。

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

在Python 3中是否有办法查询列表的名称(或元组,字典等)并进行这样的比较?显然,我在这里做的方式是不行的,因为它比较列表的内容和数据'到单个字符串' myList1',它不起作用! : - 。)

2 个答案:

答案 0 :(得分: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
      
  3. 由于各种原因,您想要执行您最初提出的建议。一个关键的原因是在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']
    

    在此示例中,ab都指向相同的列表对象。您对a的处理方式会影响b

答案 1 :(得分:1)

让我们从这开头: 你真的不应该这样做 。数据只是Python中的数据 - 标识符(例如,您用来谈论它的名称)对程序逻辑本身没有任何意义。它对程序员来说才有意义。

也就是说,有办法做你想做的事情, 并且他们做错了 。但它们是可能的,所以我们来谈谈它们。

globals()将为您提供一个字典,其中包含当前位于全局范围内的所有对象的标识符和值,值的值。这意味着你可以这样做:

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()?