2016-07-24 81 views
0
class Solution: 
    """ 
    rotates, queries and stuff blah blah blah 
    """ 
    def mains(self): 
    pass 


    def rotate(self,A): 
    n = len(A[0]) 
    T = [[0]*n]*n 
    # the above part is erraneous probably, on individual initialization it works! 
    for i in xrange(n): 
     for j in xrange(n): 
      T[i][j] = A[j][i] 


    print T 



p = Solution() 
p.rotate([[1,2,3],[4,5,6],[7,8,9]])  

輸出[[3,6,9],[3,6,9],[3,6,9]]這是不轉置爲什麼這代碼返回Ť矩陣的最後一行

+0

我想這是

a = b = 3 b = 4 print(a, b) # 3 4 

及注意事項,有什麼用可變對象發生值得再次提到整潔的(python-3)'T = list(zip(* p))' – Aguy

+0

@Aguy它也適用於Python 2。 –

回答

1

這是因爲[[0]*n]*n創建充滿引用同一列表[0]*n)大小n的列表,所以當你訪問T[i][j],您使用的是相同的內存位置。

這裏有不同的設置的一些例子:這是創建列表和在同一數據填補他們一個非常強大的方式

>>> T=[[0]*5]*5 
>>> T 
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 
>>> T[0][0]=5 
>>> T #goes nuts 
[[5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0]] 

>>> T=[[0 for _ in range(5)]]*5 
>>> T 
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 
>>> T[0][0]=5 
>>> T #goes wrong 
[[5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0]] 

>>> T=[[0 for _ in range(5)] for _ in range(5)] 
>>> T 
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 
>>> T[0][0]=5 
>>> T #this is correct! 
[[5, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 

>>> T=[[0]*5 for _ in range(5)] 
>>> T 
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 
>>> T[0][0]=5 
>>> T #this is also correct! 
[[5, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 

在除了第一個例子中,我使用list comprehensions,時間。

+0

這確實幫助了@ForceBru! –

+0

@ Vashisht.gupta然後你應該接受這個答案。 –

+0

@EliKorvigo是的,我沒有:) –

1

你們的做法,同樣子列表被複制n時間:

T = [[0]*n]*n 

因此改變通過它們同時體現。


而應該建立T像這樣:

T = [[0]*n for _ in range(n)] 

這將創建n獨立的子列表。

1

你被list實例的可變性所困住。這裏

T = [[0]*n]*n 

內繁殖創造n引用到int實例。由於Python的int是不可變的,所以當您更改一個時,會在後臺創建一個新對象和一個新引用。 list s是不同的。您的外部乘法將引用複製到同一列表中,即[0] * n。由於Python的列表是可變的,所以無論何時通過一個引用來更改它,更改都會反映在所有引用中,因爲它們都引用內存中的同一個對象。

例如:

a = b = [1, 2, 3] 
b[1] = 0 
print(a, b) # [1, 0, 3] [1, 0, 3] 
0

你也可以建立您的清單,而循環:

>>> T = [] 
>>> 
>>> for i in xrange(3): 
     T.append([]) 
      for j in xrange(3): 
       T[i].append(l[j][i]) 


>>> T 
[[1, 4, 7], [2, 5, 8], [3, 6, 9]] 
相關問題