2017-04-22 68 views
-2

我想在Python中創建一個12x12矩陣。我將所有位置設置爲"High",然後我嘗試將一個特定位置設置爲"Low"。在打印命令都是"Low"當我想第一個是"Low",我希望第二個仍然"High",因爲它沒有改變(我認爲)。我究竟做錯了什麼?如何更改矩陣中的值?

HourlyUsageBlock = ["High" for x in range(12)] 
WorkDayUsageBlock = [HourlyUsageBlock for x in range(12)] 
Hour = 2 
MinBlock = 6 
WorkDayUsageBlock [MinBlock][Hour] = "Low" 
print (WorkDayUsageBlock[6][2]) 
print (WorkDayUsageBlock[10][2]) 
+0

[如何在Python中初始化二維數組?](http://stackoverflow.com/questions/2397141/how-to-initialize-a-two-dimensional-array-in-python) – pvg

+1

你做錯了什麼是你在'WorkDayUsageBlock'中引用同樣的東西('HourlyUsageBlock')。你的理解不會產生_copy_,它只是指向它。 'WorkDayUsageBlock'是一些指向相同的'HourlyUsageBlock'的列表。 – pvg

+0

@pvg:不,不是IMO問題的重複。 – martineau

回答

0

當你初始化WorkDayUsageBlock你基本上把相同的HourlyUsageBlock放在每個位置。由於WorkDay中的所有元素都是相同的列表,因此更改一個元素將會改變所有元素。

嘗試這種解決方案:

WorkDayUsageBlock = [["high" for x in range(12)] for y in range(12)] 

或者,你可以使用lst.copy():

WorkDayUsageBlock = [HourlyUsageBlock.copy() for x in range(12)] 

我建議你閱讀有關Python中的可變和imutable對象。

+0

在Python 2中,'HourlyUsageBlock'這樣的list對象沒有'copy()'方法,直到Python 3.3才被添加。然而,在Python 2&3中,通過使用'[HourlyUsageBlock [:] for _ in range(12)]''可以獲得'list'實例的副本。 – martineau

0
>>> print (WorkDayUsageBlock) 
[['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High']] 

你可以看到每行每3個要素是「低」,因爲理解只是利用相同HourlyUsageBlock。所以當你改變3rd元素的值時,它會在每一行中反映出來,因爲理解不會複製HourlyUsageBlock