python 動態生成變量名以及動態獲取變量的變量名


前言
需求:
必須現在需要動態創建16個list,每個list的名字不一樣,但是是有規律可循,比如第一個list的名字叫:
arriage_list_0=[],第二個叫arriage_list_1=[]……..依次類推,但是我又不想手動的去寫16個這樣的名字,太累了,而且增加了代碼的冗余性,靈活性也不強,所以有沒有一種方法是能動態創建list名稱的呢?答案是有的!而與之對應,既然要對上面的列表動態操作,肯定是少不了動態去解析list名稱。所以下面開始介紹方法。

python 動態生成變量名
locals函數
代碼之前,先介紹一個函數:
locals() 函數會以字典類型返回當前位置的全部局部變量。
菜鳥上的例子:

>>>def runoob(arg): # 兩個局部變量:arg、z
... z = 1
... print (locals())
...
>>> runoob(4)
{'z': 1, 'arg': 4} # 返回一個名字/值對的字典
1
2
3
4
5
6
下面用自己的例子來實現下,目標:動態創建名字為list_0到list_15的16個list列表:

關鍵代碼:

# 第一步 准備locals函數
prepare_list = locals()
"""
第二步 循環16次,從0-15賦值給locals函數對應的變量prepare_list
prepare_list是一個字典,所以將我們需要的列表名稱作為key值傳入
"""
for i in range(16):
arriage_list['list_' + str(i)] = []
1
2
3
4
5
6
7
8
測試代碼:

def test_list_pre():
prepare_list = locals()
for i in range(16):
prepare_list['list_' + str(i)] = []
prepare_list['list_' + str(i)].append(('我是第' + str(i)) + '個list')
print(prepare_list['list_0'])
print(prepare_list['list_1'])
print(prepare_list['list_2'])
print(prepare_list['list_3'])

if __name__ == '__main__':
test_list_pre()
1
2
3
4
5
6
7
8
9
10
11
12
實驗截圖:


實際證明,已經動態的每次往list插入了值。

python 動態獲取變量的變量名
需求目標:如果有了上面的動態命名list,那么當動態獲取變量的變量名,就需要如下的操作:
利用python原生的inspect庫來實現:
核心代碼:

import inspect
def get_variable_name(variable):
callers_local_vars = inspect.currentframe().f_back.f_locals.items()
return [var_name for var_name, var_val in callers_local_vars if var_val is variable]
1
2
3
4
5
測試代碼:

def get_variable_name(variable):
callers_local_vars = inspect.currentframe().f_back.f_locals.items()
return [var_name for var_name, var_val in callers_local_vars if var_val is variable]


if __name__ == '__main__':
prepare_list = locals()
for i in range(16):
prepare_list['list_' + str(i)] = []
prepare_list['list_' + str(i)].append(('我是第' + str(i)) + '個list')
a = get_variable_name(prepare_list['list_0']).pop()
b = get_variable_name(prepare_list['list_1']).pop()
print(a)
print(b)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
實驗截圖:

 

以上。。。。完了
---------------------
作者:sy_y
來源:CSDN
原文:https://blog.csdn.net/s740556472/article/details/80928849
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM