2014-06-09 5 views
-3

전함을 만들려고 노력하고 있습니다. 나는 정말 명백한 것을 놓치고 있다고 가정하고 있지만 그것을 볼 수는 없습니다 ... 프로그램이 매우 빠르며 지금은 테이블을 만들 수 있다고 가정합니다.파이썬을 사용하는 3D 배열

a_user = [' ',' ',' ',' ',' ',' ',' ',' '] 
b_user = a_user 
c_user = a_user 
d_user = a_user 
e_user = a_user 
f_user = a_user 
g_user = a_user 
h_user = a_user 
y_arr = [a_user,b_user,c_user,d_user,e_user,f_user,g_user,h_user] 
def draw_Table(): 
    print(' 1 2 3 4 5 6 7 8') 
    print(' +---+---+---+---+---+---+---+---+') 
    print('1 |',a_user[0],'|',a_user[1],'|',a_user[2],'|',a_user[3],'|',a_user[4],'|',a_user[5],'|',a_user[6],'|',a_user[7],'|') 
    print(' +---+---+---+---+---+---+---+---+') 
    print('2 |',b_user[0],'|',b_user[1],'|',b_user[2],'|',b_user[3],'|',b_user[4],'|',b_user[5],'|',b_user[6],'|',b_user[7],'|') 
    print(' +---+---+---+---+---+---+---+---+') 
    print('3 |',c_user[0],'|',c_user[1],'|',c_user[2],'|',c_user[3],'|',c_user[4],'|',c_user[5],'|',c_user[6],'|',c_user[7],'|') 
    print(' +---+---+---+---+---+---+---+---+') 
    print('4 |',d_user[0],'|',d_user[1],'|',d_user[2],'|',d_user[3],'|',d_user[4],'|',d_user[5],'|',d_user[6],'|',d_user[7],'|') 
    print(' +---+---+---+---+---+---+---+---+') 
    print('5 |',e_user[0],'|',e_user[1],'|',e_user[2],'|',e_user[3],'|',e_user[4],'|',e_user[5],'|',e_user[6],'|',e_user[7],'|') 
    print(' +---+---+---+---+---+---+---+---+') 
    print('6 |',f_user[0],'|',f_user[1],'|',f_user[2],'|',f_user[3],'|',f_user[4],'|',f_user[5],'|',f_user[6],'|',f_user[7],'|') 
    print(' +---+---+---+---+---+---+---+---+') 
    print('7 |',g_user[0],'|',g_user[1],'|',g_user[2],'|',g_user[3],'|',g_user[4],'|',g_user[5],'|',g_user[6],'|',g_user[7],'|') 
    print(' +---+---+---+---+---+---+---+---+') 
    print('8 |',h_user[0],'|',h_user[1],'|',h_user[2],'|',h_user[3],'|',h_user[4],'|',h_user[5],'|',h_user[6],'|',h_user[7],'|') 
    print(' +---+---+---+---+---+---+---+---+') 
while 1: 
    draw_Table() 
    x_axis = int(input('Enter a x coord\n')) - 1 
    y_axis = int(input('Enter a y coord\n')) - 1 
    y_arr[y_axis][x_axis] = 'o' 
+0

목록은 파이썬에서 참조로 전달되고 할당됩니다. – mniip

+0

@mniip 다른 모든 것과 마찬가지로.:-) 또는 이것에 대한 다른 견해 : 모든 변수는 어떤 객체를 참조하고 객체는 할당시 복사되지 않습니다. – Kos

답변

0

당신이

b_user = a_user 
c_user = a_user 
d_user = a_user 
e_user = a_user 
f_user = a_user 
g_user = a_user 
h_user = a_user 
을하지 말아야 ...의 내용을 편집 ...하지만 선택 열의 전체 x 축이 입력을 취득하기 때문에 어쨌든, 여기에 지금까지 ... 보정을 게시하시기 바랍니다있다

목록의 내용을 복사하지 않으므로 목록 자체에 대한 참조가 복사됩니다. 그래서 모든 * _users는 같은 목록에 대한 참조입니다. a_user에서 항목을 변경하면 모든 사용자에 대해 변경됩니다.

대신 할 다음에 단축 될 수 같은

users = [] 
user[0] = [' '] * 8 
user[1] = [' '] * 8 
... 

로 아마 당신은 또한 목록 users을 만들 수

a_user = [' '] * 8 

입니다 수있는 무엇 :

users = [[' '] * 8 for k in range(8)] 

하는 경우 당신은 당신의 사용자를위한 편지를 선호합니다, 당신은 사전으로 그것을 바꿀 수 있습니다.

+0

할당은리스트를 복사하지 않습니다. 다시 말씀해주십시오. – Kos

+0

알았어, 고마워. 고마워. – Mark

3

목록 y_arr으로 작성하면 같은 목록에 대한 복수 참조, a_user이 작성됩니다.

할당 :

b_user = a_user 

a_user의 복사본을 생성하고 b_user를 호출하지 않습니다, 그것은 이름 b_user 동일한 개체 이름이 a_user 참조에 대한 참조를합니다.

동일한 값이 동일한 개체를 의미 id()를 사용하여이 문제를 설명 할 수

>>> a = [1, 2, 3] 
>>> b = a 
>>> id(a) 
53575512 
>>> id(b) 
53575512 # exactly the same object 

대신, 별도의 목록을 작성해야합니다. 최소한의 수정 예를 들어, 목록의 복사 각 변수를 확인하는 것입니다 : 사소한 예를 들어 준다

b_user = a_user[:] 

:

>>> b = a[:] 
>>> id(a) 
53575512 # still the same 
>>> id(b) 
53770480 # separate object 

그러나, 이것은 일반적으로 list comprehension 이루어집니다, 이는 상당히 깔끔 : 또한

y_arr = [[" " for _ in range(8)] for _ in range(8)] 

, 당신은 enumerate 훨씬 깔끔한 프린팅을 만들 수 0,123,및 str.join, 예 :

for index, row in enumerate(y_arr, 1): 
    print("{0} |{1}|".format(index, "|".join(row)))