2013-09-06 6 views
5
class Board: 

    def __init__(self): 
     self.board = self.createBoard() 

    def createBoard(self): 
     line = [] 
     for i in range(7): 
      line.append(' ') 
     board = [] 
     for i in range(7): 
      board.append(line) 
     return board 

    def showBoard(self): 
     line = "| " 
     for x in range(len(self.board)): 
      for y in range(len(self.board)): 
       line += self.board[x][y] + " | " 
      print("-" * 29) 
      print(line) 
      line = "| " 
     print("-" * 29) 

if __name__ == '__main__': 
    board = Board() 
    board.showBoard() 
    board.board[1][1] = "O" 
    board.showBoard() 

पर दो-आयामी सूची गलत तरीके से असाइन करने वाली सूची गलत तरीके से अजीब समस्या पर फंस गई जब मैं कनेक्ट -4 पायथन कंसोल डेमो/गेम पर काम कर रहा था।पाइथन

ऊपर कोड के उत्पादन में इस प्रकार है:

----------------------------- 
| | O | | | | | | 
----------------------------- 
| | O | | | | | | 
----------------------------- 
| | O | | | | | | 
----------------------------- 
| | O | | | | | | 
----------------------------- 
| | O | | | | | | 
----------------------------- 
| | O | | | | | | 
----------------------------- 
| | O | | | | | | 
----------------------------- 

अजीब बात यह है कि मैं उन सभी पदों के लिए O सौंपा कभी नहीं, मैं सिर्फ यह स्थिति करने के लिए सौंपा [1] [1]।

----------------------------- 
| | | | | | | | 
----------------------------- 
| | O | | | | | | 
----------------------------- 
| | | | | | | | 
----------------------------- 
| | | | | | | | 
----------------------------- 
| | | | | | | | 
----------------------------- 
| | | | | | | | 
----------------------------- 
| | | | | | | | 
----------------------------- 

की बहुत अधिक संभावना है कि मैं कुछ स्पष्ट और छोटे याद कर रहा हूँ है, लेकिन मैं देख रहा था और एक घंटे से अधिक के लिए कोशिश कर रहा है और मैं वास्तव में नहीं कर सकते हैं:

मैं उत्पादन होने की उम्मीद थी समस्या पाएं

यह मेरी बोर्ड की तरह नहीं है। बोर्ड सूची किसी अन्य द्वि-आयामी सूची की तुलना में कहीं अधिक विषम है।

>>> a = [[' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ']] 
>>> a[1][1] = "O" 
[[' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', 'O', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ']] 

कौन सा मुझे उचित बोर्ड मूल्य हो जाता है:

[[' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ']] 

को कॉपी करके पेस्ट कि निष्क्रिय मैं में निम्नलिखित (यह जब मैं print(board.board) मैं क्या मिलता है)।

मेरे कोड में इतना स्पष्ट रूप से गलत क्या है कि मुझे यह याद आ रही है? मुझे पूरा यकीन है कि जब आप में से कोई भी जवाब पाता है कि मैं शर्म में अपना सिर हिला दूंगा, तो यह संभव है कि यह बुरा हो।

पर्याप्त आत्म-शर्मनाक, तो मेरा कोड board.board[1][1] = "O"board.board में प्रत्येक पंक्ति में मान "ओ" असाइन क्यों करता है?

0-6 से किसी अन्य नंबर पर पहले 1 को बदलने से कुछ भी नहीं बदलेगा। सभ एक ही है।

+0

मुझे यकीन है कि यह 100 अन्य प्रश्न का डुप्लिकेट है कर रहा हूँ , लेकिन दुर्भाग्यवश इसे खोजने के लिए अच्छे खोज शब्दों को समझना बहुत मुश्किल है, इसलिए प्रश्न को दोहराने के लिए किसी को दोष देना मुश्किल है ... दाईं ओर के कुछ संबंधित प्रश्न निश्चित रूप से संबंधित हैं, लेकिन उनमें से कोई भी डुप्लिकेट नहीं लगता है। – abarnert

उत्तर

6

यह How do I create a multidimensional list के तहत FAQ में समझाया गया है?

समस्या कोड के इस हिस्से में है:

board = [] 
for i in range(7): 
    board.append(line) 

आप एक ही सूची, line करने के लिए 7 संदर्भ के साथ एक सूची बना रहे हैं। इसलिए, जब आप एक को संशोधित करते हैं, तो अन्य सभी बदल जाते हैं, क्योंकि वे एक ही सूची में होते हैं।

def createBoard(self): 
    board = [] 
    for i in range(7): 
     line = [] 
     for i in range(7): 
      line.append(' ') 
     board.append(line) 
    return board 

या, अधिक बस, मूल सूची के अलग प्रतियां बनाने:

def createBoard(self): 
    line = [] 
    for i in range(7): 
     line.append(' ') 
    board = [] 
    for i in range(7): 
     board.append(line[:]) 
    return board 

हम पर हैं ही

समाधान 7 अलग सूची बनाने के लिए, इस तरह है इस पर, आप सूची समझ का उपयोग करके इस जबरदस्त सरलता को सरल बना सकते हैं:

def createBoard(self): 
    return [[' ' for j in range(7)] for i in range(7)] 

या, जैसा कि अकसर किये गए सवाल पता चलता है, तो आप एक होशियार बहुआयामी सरणी वस्तु का उपयोग करने, लोगों को NumPy या पांडा प्रदान की तरह बेहतर कर सकता है:

def createBoard(self): 
    return np.tile(' ', (7, 7)) 

नुकसान यह है कि आप numpy स्थापित करना होगा है, क्योंकि मानक लाइब्रेरी में कुछ भी नहीं है जो इस तरह काम करता है। लेकिन इसका फायदा यह है कि आपके पास सरणी से निपटने के लिए शक्तिशाली उपकरण हैं- a[1, 1]a[1][1] से अधिक आसान नहीं है, लेकिन दूसरे कॉलम तक पहुंचने के लिए a[:,1][row[1] for row in a] से बहुत आसान है।

+0

जैसा मैंने सोचा था, कुछ छोटा और सरल। त्वरित उत्तर के लिए धन्यवाद और अक्सर पूछे जाने वाले प्रश्नों के संदर्भ के कारण सर्वश्रेष्ठ उत्तर के रूप में चुना गया। – Azeirah

0

यह संदर्भों का उपयोग करके अजगर का मुद्दा है। CreateBoard

for i in range(7): 
     board.append(line) 

बाहरी सूची में एक ही सूची में 7 संदर्भ डाल रहा है। तो आपके पास एक ही सूची की 7 प्रतियों की एक सूची है। इन उपन्यासकारों में से किसी एक में एक मूल्य को संपादित करना वास्तव में उन सभी को अद्यतन करता है क्योंकि वे एक ही स्मृति का संदर्भ दे रहे हैं।

एक विकल्प copy.deepcopy उपयोग करने के लिए, या स्पष्ट रूप से प्रत्येक पंक्ति के लिए एक नई सूची बनाने के लिए होगा

import copy # at the top of the file 
for i in range(7): 
    board.append(copy.deepcopy(line)) 

या

for i in range(7): 
    board.append(list(' ' * 7))