這個問題在這里已經有了答案: 使用字典的鍵值對分配作為 for 回圈中的迭代器 2 個回答 昨天關閉。
說我們有這個
>>> x = {'a': 1, 'b': 2}
>>> y = {}
>>> for k, y[k] in x.items(): pass
...
>>> y
{'a': 1, 'b': 2}
為什么這樣做?
注意:我首先在這里看到這個
uj5u.com熱心網友回復:
a, b = (c, d)從左到右解包元組a = c并按b = d順序分配和。
x.items()迭代中的鍵值對x。例如做list(x.items())會給[('a', 1), ('b', 2)]
for a, b in x.items()將鍵分配給a,并將值分配給 中的b每個鍵值對x。
for k, y[k] in x.items()將鍵分配給k,并將值分配給 中的y[k]每個鍵值對x。
您可以使用kiny[k]因為k自從拆包發生左右以來已經被分配
你不需要在回圈中做任何事情,因為你需要的任何東西都已經完成了。
因為回圈已經分配了xto 中的每個值y[k],y現在是x.
正如您參考的推文所說,這確實是一種“簡潔、不直觀且令人困惑”的做法x.copy()
uj5u.com熱心網友回復:
這是使用回圈系結的一種非常奇怪的方式。對于每個專案, 的元組(key, value)被分配到 中k, y[k]。的兩個實體都k參考同一個變數,因此訂閱 y[k]分配到字典中y。這依賴于從左到右解決的解構賦值;usingy[k], k不起作用,因為k它不是第一次通過回圈分配的。
uj5u.com熱心網友回復:
迭代變數在迭代可迭代物件時被賦值。在您的情況下,k, y[k]分配了(key, value)from dict.items()。
在您的情況下,y[k]實際上是dict.__setitem__在這里呼叫,這就是您y更新的原因。
例子,
class T():
def __setitem__(self, key, value):
print(f"Assigning {key} with value {value}")
x = {"a": 2, "b": 3, "c": 4}
val = T()
for k, val[k] in x.items():
pass
Assigning a with value 2
Assigning b with value 3
Assigning c with value 4
在您的情況下dict.__setitem__,在迭代時呼叫x.items()并dict.__setitem__改變您的 dicty所以最終您將xdict復制到y.
順便說一句:我還有一種“令人討厭、不直觀和令人困惑”的方式來復制字典。
x = {'a': 2, 'b': 3, 'c': 4}
it = iter(x.items())
y = {}
[*iter(lambda : y.__setitem__(*next(it)), "Is this confusing enough??")]
print(y)
# {'a': 2, 'b': 3, 'c': 4}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/334492.html
