2017-04-22 71 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