Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取列表名称以进行比较_Python - Fatal编程技术网

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

Python 如何获取列表名称以进行比较,python,Python,这听起来可能有点滑稽,但这就是我想要做的: 我有两个列表:myList1和myList2。我将这些列表传递给一个函数,该函数将根据接收到的列表执行特定任务(即,基于列表的名称,而不是内容) 在Python3中有没有办法查询列表(或元组、字典等)的名称并进行这样的比较?显然,我在这里做的方式不起作用,因为它将列表“data”的内容与单个字符串“myList1”进行比较,而单个字符串“myList1”不起作用!:-) 那么让我们从这个开始:你真的不应该这样做。数据在Python中只是数据——标识符(

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


在Python3中有没有办法查询列表(或元组、字典等)的名称并进行这样的比较?显然,我在这里做的方式不起作用,因为它将列表“data”的内容与单个字符串“myList1”进行比较,而单个字符串“myList1”不起作用!:-)

那么让我们从这个开始:你真的不应该这样做。数据在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()?

有几种方法可以做到这一点:

  • 如果需要为每个列表执行的操作实际上是完全独立的,则可以创建单独的函数

  • 您可以将函数更新为:

  • 以两个列表作为参数:

    def list_processor(list1=None, list2=None):
       if list1:
          # do stuff for list1
       if list2:
          # do stuff for list2
    
  • 您可以添加一个额外的标志,标识要执行的操作类型,并设置默认值:

    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

    嗯。。。看起来我需要学习在这个网站上发帖的技巧,因为最终的文本看起来与我实际键入的内容大不相同!对象本身没有名称,它们只有ID。除此之外,你选择了一个非常糟糕的方式来做这件事。好吧!我现在明白了(对python编程来说比较新)。那么,我怎样才能做得更好呢?@lookiluke使用两个不同的函数!或者让
    listProcessor
    (根据PEP8,应将其命名为
    list\u processor
    listProcessor
    )检查该列表,以查看应对其采取的操作。可能两者都有!可以将标志参数添加到函数的参数列表中。或者,如果在函数的作用域内可以访问
    myList1
    ,请检查
    数据是否为myList1
    谓词。这将根据两个对象的标识来比较它们。
    >>> 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']