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
>>> 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']