我认为这应该很简单,但我不知道该怎么做。我有一个列表变量元组:
A = (a,b,c)
,其中
a = [1,2,3,...]
b = [2,4,6,4,...]
c = [4,6,4,...]
我想创建一个元组或列表,它是变量的名称。所以,
A_names = ('a','b','c')
我怎么能这样做?我的元组将有更多的变量,并不总是相同的变量。我试过像
这样的东西A_names = tuple([str(var) for var in A])
但这不起作用。
答案 0 :(得分:1)
假设您需要动态/可访问的名称,则需要使用字典。
这是一个带字典的实现:
my_variables = {'a': [1,2,3,...],
'b': [2,4,6,4,...],
'c': [4,6,4,...]}
my_variable_names = my_variables.keys()
for name in my_variable_names:
print(my_variables[name])
答案 1 :(得分:1)
你问的问题是,做A = (a, b, c)
并不会分配变量" a"," b"和" c"到元组A
。相反,您正在为这些名称引用的每个对象创建一个新引用。
例如,如果我做了A = (a,)
,则是一个包含单个对象的元组。我没有分配变量" a"。而是在元组对象中的位置0处创建引用。该引用是名称a
引用的同一对象。
>>> a = 1
>>> b = 2
>>> A = (a, b)
>>> A
(1, 2)
>>> a = 3
>>> A
(1, 2)
请注意,为a
分配新值根本不会更改元组中的值。
现在,您可以使用locals()
或globals()
字典并查找与A
中的字词匹配的值,但由于您可以拥有多个值,因此无法保证准确性名称指的是相同的值,你不知道哪个是哪个。
>>> for key, val in locals().items():
if val in A:
print(key, val)
('a', 1)
('b', 2)
答案 2 :(得分:1)
我的连接搞砸了所以我不能早点发布,但我相信这可以解决你的问题而不用字典。
import inspect
def retrieve_name(var):
local_vars = inspect.currentframe().f_back.f_locals.items()
return [var_name for var_name, var_val in local_vars if var_val is var]
a = [1,2,3]
b = [2,4,6,4]
c = [4,6,4]
a_list = (a,b,c)
a_names = []
for x in a_list:
a_names += (retrieve_name(x)[0])
print a_names
输出['a', 'b', 'c']
答案 3 :(得分:0)
出于学术兴趣:
dir() will give you a list of the variables currently visible,
locals() gives the list of local variables
globals() (guess)
请注意,一些意外变量将显示(以__开头和结尾),这些变量已由Python定义。
答案 4 :(得分:0)
A = {'a' : [1,2,3,...],
'b' : [2,4,6,4,...],
'c' : [4,6,4,...]}
A_names = A.keys()
for name in A_names:
print(A[name])
然后,您可以随时通过说:
将新值添加到字典中A.update({'d' : [3,6,3,8,...], 'e' : [1,7,2,2,...]})
或者,您可以通过以下方式更改项目的值:
A.update({'a' : [1,3,2,...]})
要打印特定值,您只需输入:
即可print(A['c'])