我不确定这是否可以通过简单的方式实现,但我正在尝试获取列表对象的名称。
我确实尝试过
__name__
但出现错误,因为列表对象没有属性 __name__
甚至可以获取列表的变量名称,而无需子类化列表对象并添加
__name__
属性吗?
编辑 这与建议的重复项无关。
这是我的场景:
cucumbers=[]
oranges=[]
salads=[]
...
masterlist=[cucumbers, oranges, salads]
有时我只得到 2 个列表,有时我得到 5 个,所以主列表每次都有不同数量的列表;当我打印它时,我只得到值;所以我不知道第一个清单是黄瓜、橙子、沙拉还是其他什么。
我正在尝试查询列表,以便获得
variable name
,而不是对象的类型。所以 print masterlist[1].name
会给我“黄瓜”或任何与该列表相关的名称。
您可以简单地使用字典来代替:
masterdict={'cucumbers': cucumbers, 'oranges': oranges, 'salads': salads}
而不是检查名称,而是迭代字典的项目:
for name, sublist in masterdict.items():
print(name, sublist)
如果您想要订购它(并且您没有订购
dict
的 Python 3.6),则可以使用 collections.OrderedDict
。
获取变量名称的问题是变量引用Python对象,但可能有许多(不同名称的)变量引用同一个对象。此外,对象不需要(可见的)名称来存在。例如,如果您有类似的内容:
def func():
cucumber = [1, 2, 3]
return [cucumber]
那么当函数完成时,名称
cucumber
就不再存在了。但是该对象([1, 2, 3]
列表)仍然存在,但因为它被包装在另一个列表中,所以它甚至不再有“名称”。当返回值存储在变量中时,只有外部列表可以有一个名称。
定义3个列表,并将它们放入一个更大的列表中:
In [1]: x = [1,2,3]
In [2]: y = ['a','b','c']
In [3]: z = []
In [4]: alist = [x, y, z]
显示更大的列表:
In [5]: alist
Out[5]: [[1, 2, 3], ['a', 'b', 'c'], []]
查看该列表中的一个元素:
In [7]: alist[0]
Out[7]: [1, 2, 3]
alist
包含指向其他列表对象的指针,我们可以通过查看id
来检查:
In [8]: id(alist[0])
Out[8]: 2895592076
In [9]: id(x)
Out[9]: 2895592076
但是给定一个
id
,没有一种简单的方法可以找到指向该对象的所有变量。
要记住的关键一点是变量
x
、其名称和它引用的对象之间存在差异。
我可以分配另一个变量来指向列表对象:
In [10]: x1 = x
In [11]: id(x1)
Out[11]: 2895592076
我还可以将这些列表放入字典中:
In [12]: dd = {'x': x, 'y1': y, 'zfoo': z}
In [13]: dd
Out[13]: {'x': [1, 2, 3], 'y1': ['a', 'b', 'c'], 'zfoo': []}
In [14]: id(dd['x'])
Out[14]: 2895592076
请注意,字典中的名称或键不必与全局命名空间中的名称匹配。
从某种意义上说,仅仅因为我用
alist
构造了 [x, y, z]
并不意味着 Python 会保留该语句的记录。 alist
包含指向 x
、y
和 z
引用的对象的指针,但不保留该语句中使用的变量名称的任何记录。
所以我认为你所要求的在Python中是不现实的。
切换
x
、y
参考而不更改 alist
:
In [15]: x, y = y, x
In [16]: alist
Out[16]: [[1, 2, 3], ['a', 'b', 'c'], []]
In [17]: x
Out[17]: ['a', 'b', 'c']
In [18]: x1 # x and x1 no longer point to the same object
Out[18]: [1, 2, 3]
你可以通过在俄亥俄州斯基比迪 gman 的帮助下用 fanum 征税的 rizz 来提高 sigma alpha beta 的 gyatt 的宝贝 gronk 来做到这一点吗?