我試圖了解這個 for 回圈是如何作業的。我有一個字母串列(first_list = ["A","B","C"]),我想列印所有可能的串列,沒有每個字母(["B","C"]; ["A “,“出租車”])。我有這個回圈,但我不明白為什么它不起作用:
first_list = ["A","B","C"]
for i in first_list:
second_list = first_list
second_list.remove(i)
print(second_list)
--> ['B', 'C']
['B']
另一方面,我有這個回圈,它有效,但我也不明白它為什么有效,兩個回圈有什么區別
first_list = ["A","B","C"]
for i in first_list:
first_list = ["A","B","C"]
second_list = first_list
second_list.remove(i)
print(second_list)
-->['B', 'C']
['A', 'C']
['A', 'B']
你能幫我理解這兩個 for 回圈是如何作業的嗎,還有另一種方式來獲得這個輸出(除了 for 回圈之外)嗎?
uj5u.com熱心網友回復:
發生這種情況是因為 python 分配參考只是分配地址而不是值,當您second_list = first_list將 ["A","B","C"](這是一個物件并且有一個地址)的這個地址分配給 second_list 變數時。所以現在 first_list 和 second_list 都指向同一個地址,這意味著任何變數的變化都會反映在其他變數中,直到任何變數指向其他物件,first_list = ["A","B","C"]每次你這樣做時都會創建這個新物件,并且它的地址被分配給那個特定的變數所以它在第二個代碼中作業。有關參考如何作業的詳細說明,請參閱此鏈接
first_list = ["A","B","C"]
for i in first_list:
second_list = first_list.copy()
second_list.remove(i)
print(second_list)
uj5u.com熱心網友回復:
如果您想獲得串列的所有可能組合,您可以使用itertools.combinations!
import itertools
[combination for combination in itertools.combinations(["A","B","C"], 2)]
將給出以下結果:
[('A', 'B'), ('A', 'C'), ('B', 'C')]
uj5u.com熱心網友回復:
在第一個代碼片段中,您設定second_list為指向與first_list. 因此,對 的更改(即洗掉)second_list也將反映在first_list. 在第二個代碼片段中,您在回圈的每次迭代開始時重新初始化first_list為。在這種情況下,您將在每次迭代的新串列上進行操作。["A","B","C"]for
您需要使用某種迭代結構來確定要為給定迭代洗掉哪個元素,但您可以使用串列推導使其更簡潔:
first_list = ["A","B","C"]
for skip_index in range(len(first_list)):
print([elem for index, elem in enumerate(first_list) if index != skip_index])
uj5u.com熱心網友回復:
如果去掉重用的區域變數first_list,就更容易理解了:
for i in ["A", "B", "C"]:
selections = ["A", "B", "C"]
selections.remove(i)
print(selections)
這是一個組合程式(3 選 2)。您可以使用 python itertools 組合生成此輸出(https://docs.python.org/3.1/library/itertools.html?highlight=combinations#itertools.combinations)
>>> from itertools import combinations
>>> list(combinations(['A', 'B', 'C'], 2))
[('A', 'B'), ('A', 'C'), ('B', 'C')]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/428056.html
