相同的代码执行不同

时间:2016-11-21 22:21:50

标签: python python-3.x

我正在尝试制作一个扫雷游戏,但我仍然坚持在空白字段中添加一个界面。 为什么是这样?我无法识别问题,因为应该这样做的代码有效!添加输入语句

时,答案会发生变化

没有输入

import string
def add_markers(grid,alphabet):
    top = [' ']
    for count in range(len(grid[0])):
        top.append(alphabet[count])

    grid.insert(0,top)
    for row_num in range(len(grid)):
        if row_num != 0:
            grid[row_num].insert(0,row_num)

    return grid
blank = [['#', '#', '#', '#', '#'], ['#', '#', '#', '#', '#'],['#', '#', '#', '#', '#'], ['#', '#', '#', '#', '#'], ['#', '#', '#', '#', '#']]
user_grid = add_markers(blank, list(string.ascii_lowercase + string.ascii_uppercase))
print(user_grid)

输出正确的网格[[' ', 'a', 'b', 'c', 'd', 'e'], [1, '#', '#', '#', '#', '#'], [2, '#', '#', '#', '#', '#'], [3, '#', '#', '#', '#', '#'], [4, '#', '#', '#', '#', '#'], [5, '#', '#', '#', '#', '#']]

输入

import random, string

def add_markers(grid,alphabet):
    top = [' ']
    for count in range(len(grid[0])):
        top.append(alphabet[count])

    grid.insert(0,top)
    for row_num in range(len(grid)):
        if row_num != 0:
            grid[row_num].insert(0,row_num)

    return grid

alphabet = list(string.ascii_lowercase + string.ascii_uppercase)
length = int(input('length of field > '))
height = int(input('height of field > '))
bombs = int(input('number of bombs > '))
blank = [length * ['#']] * height

user_grid = add_markers(blank, alphabet)
print(user_grid)

输出: [[' ', 'a', 'b', 'c', 'd', 'e'], [5, 4, 3, 2, 1, '#', '#', '#', '#', '#'], [5, 4, 3, 2, 1, '#', '#', '#', '#', '#'], [5, 4, 3, 2, 1, '#', '#', '#', '#', '#'], [5, 4, 3, 2, 1, '#', '#', '#', '#', '#'], [5, 4, 3, 2, 1, '#', '#', '#', '#', '#']]

1 个答案:

答案 0 :(得分:1)

问题是你构造空白的方式。按照您当前使用的方式进行操作,您实际上创建了对同一列表的多个引用。

这是一个例子,说明当你按照现在的方式构建它时会发生什么:

in: blank[0].append(1)
in: blank
out: [['#', '#', '#', '#', '#', 1], ['#', '#', '#', '#', '#', 1], ['#', '#', '#', '#', '#', 1], ['#', '#', '#', '#', '#', 1], ['#', '#', '#', '#', '#', 1]]

由于空白中包含的所有列表实际上只是对同一列表的引用,因此对它们中的任何一个进行更改都会影响它们。

这是一个简单的解决方案,用这个替换你的空白构造函数:

for i in range(length):
    blank.append([])
    for j in range(height):
        blank[i].append('#')

这样,您实际上将构建独立列表。

示例行为,符合您的需求:

in: blank[0].append(1)
in: blank
out: [['#', '#', '#', '#', '#', 1], ['#', '#', '#', '#', '#'], ['#', '#', '#', '#', '#'], ['#', '#', '#', '#', '#'], ['#', '#', '#', '#', '#']]