这可能听起来有点滑稽,但这是我想要做的:
我有两个列表:myList1
和myList2
。我将这些列表传递给一个函数,该函数将根据它接收的列表执行特定任务(即,基于列表的名称,而不是内容)。
def listProcessor(data):
if data == 'myList1':
perform task1
else: #meaning data is myList2
perform task 2
在Python 3中是否有办法查询列表的名称(或元组,字典等)并进行这样的比较?显然,我在这里做的方式是不行的,因为它比较列表的内容和数据'到单个字符串' myList1',它不起作用! : - 。)
答案 0 :(得分:2)
有几种方法可以做到这一点:
如果每个列表需要完成的内容确实是完全独立的,您可以创建单独的函数。
您可以将功能更新为:
将两个列表作为参数:
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
。
答案 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()?