我試圖理解為什么其中一個失敗而另一個有效。
my_prd = { 'server': 'prd.my.company.com' }
my_lab = { 'server': 'prd.my.company.com' }
my_srv = {}
def test_fails(which):
if which == 'prd':
my_srv = my_prd
else:
my_srv = my_lab
def test_works(which):
if which == 'prd':
my_srv['server'] = my_prd['server']
else:
my_srv['server'] = my_lab['server']
輸出:
fails: my_srv={}
works: my_srv={'server': 'prd.my.company.com'}
我將把我的參考邏輯移到我的函式之外來處理這個問題,但我想了解為什么my_srv
在范圍內足夠我可以為它分配值,但在范圍內不足以被參考或copy()
ied?
uj5u.com熱心網友回復:
在test_fails()
中,您分配my_srv = my_prd
(或my_srv = my_lab
)。這意味著這my_srv
是一個參考 的變數my_prd
,就像我們在其他語言中所說的“指標”(在 Python 中,“一切都是指標”)。您可以使用my_srv
其余部分test_fails()
,但是一旦您離開函式,區域變數就會被遺忘并my_srv
再次參考空字典。
也許這將有助于您希望做的事情:
>>> my_prd = { 'server': 'prd.my.company.com' }
>>> my_lab = { 'server': 'prd.my.company.com' }
>>> my_srv = {}
>>> def test_fails(which):
... if which == 'prd':
... my_srv = my_prd
... else:
... my_srv = my_lab
... my_srv["key"] = "item"
...
>>> print(my_prd)
{'server': 'prd.my.company.com'}
>>> test_fails("prd")
>>> print(my_prd)
{'server': 'prd.my.company.com', 'key': 'item'}
uj5u.com熱心網友回復:
當您在函式內部創建變數時,該變數默認為區域變數,這意味著一旦您退出函式,它就不再存在(并且不與全域變數存盤在同一位置,因此具有全域變數和區域變數同名不是問題),這就是你寫的
my_srv = my_prd
當您退出 test_fails() 并訪問 my_srv 時,python 會在全域變數中查找 my_srv,它發現未觸及并等于 {},全域 my_srv 和本地 my_srv 從未相關,它們只是碰巧有相同的名稱,但是總是存在于兩個截然不同的環境中。
但是,在 test_works() 中,您不創建任何變數,而是告訴 python 在已經存在的字典中創建一個額外的鍵/值對,即 my_srv 全域變數,因此當您退出 test_works() 時,您的作業仍然存在。
uj5u.com熱心網友回復:
正如其他人所提到的,Python 默認創建區域變數。至少在 Python 3.x 中看起來像 global 和 nonlocal 這樣的關鍵字可以改變命名空間的處理方式。
就我而言,這有效:
def test_fails(which):
global my_srv #<<< Add this and it will work
if which == 'prd':
my_srv = my_prd
else:
my_srv = my_lab
我找到的一個很好的參考是:Global vs. Local Variables and Namespaces
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/492316.html
上一篇:如何將串列、字典、int保存到檔案中,并從檔案中分配回來
下一篇:按陣列中dict的值搜索