鱼C论坛

 找回密码
 立即注册
查看: 3378|回复: 1

列表进行切片操作后为什么改一个列表另一个值也会变

[复制链接]
发表于 2017-4-27 09:59:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
根据小甲鱼老师课后布置的自动动手写一个自己想写的东西。我准备写一个扫雷的小程序,
但在pycharm打印调试时发现我的s2_list的值变动后s1_list的值也变了,但我s2_list并不是赋值而是切片来的啊!
想了半天没想清楚,希望有大神解答?代码如下:
# sel: 级别选择     s1_list: 总的矩阵列表    s2_list:屏幕打印矩阵    landmine:地雷个数    all_c_list:所有坐标的列表
# landmine_list:地雷坐标的列表

import easygui as g
import random
import pickle


def sweeping():
    """
    开始游戏--选择级别--生成相符的矩阵--进入游戏--第一次点击-即输入坐标(检查输入是否合法)--随机生成一定数量的雷(第一次坐标处除外)
    --循环输入坐标开始扫雷(两种选择Y/N,选y输入坐标打开数字,选n输入坐标标记雷)--雷用‘@’符号显示--若打开了雷则游戏失败结束,显示后
    更新历史记录的数据--若最后未打开的坐标与雷数相同则游戏成功结束,显示后更新记录的数据--询问是否开始下一局--否定则退出游戏
    """

    g.msgbox('欢迎来到木有界面的小游戏——扫雷(希望您能完成一次完整游戏)')
    while True:
        all_c_list = []    #可以选择的坐标列表
        sel = g.indexbox('请选择您的游戏级别', title='难度选择', choices=('低级(9×9,10个雷)', '中级(16×16,40个雷)', '高级(16×30,99个雷)'))
        if sel == 0:          # 根据选择来定义矩阵的大小
            x, y = 10, 10
            landmine = 9
        elif sel == 1:
            x, y = 17, 17
            landmine = 40
        else:
            x, y = 31, 17
            landmine = 99
        s1_list = matrix(x, y)   # 总的矩阵
        s2_list = s1_list[:]

        for i in range(1, y):   # 将所有的坐标值传入可选择的坐标列表
            for j in range(1, x):
                all_c_list.append(s1_list[i][j])      # 取得所有可用坐标,并放入列表
        x1, y1 = c_input(x, y)        # 获取输入坐标的值
        all_c_list.remove((x1, y1))    # 将第一次输入坐标删除  确保第一次无雷
        landmine_list = random.sample(all_c_list, landmine)   # 随机获得地雷坐标的列表
        for i in range(1, y):
            for j in range(1, x):
                if (j, i) in landmine_list:
                    s2_list[i][j] = '■'
                else:
                    s2_list[i][j] = '■'
        for i in range(y):      # 打印测试
            for j in range(x):
                if (i == 0 and j < 10) or (j == 0 and i < 10):
                    print(s2_list[i][j], end='  ')
                else:
                    print(s2_list[i][j], end=' ')
            print('\n')
        
    # file_list = pickle.load(open('历史记录.pkl', 'rb'))    # 读取历史数据存入sl_list列表中 [已玩游戏数, 胜利游戏数, 获胜占比]


def matrix(x, y):
    """根据传入的参数定义矩阵,然后将矩阵返回"""
    matrix_list = []
    for i in range(y):
        matrix_list.append([])
        for j in range(x):
            matrix_list[i].append([])
    for i in range(y):
        for j in range(x):
            if i == 0:
                matrix_list[i][j] = j
            elif j == 0:
                matrix_list[i][j] = i
            else:
                matrix_list[i][j] = (i, j)
    return matrix_list

def c_input(x, y):
    """对输入坐标做判断"""
    while True:
        try:
            c_list = input('请输入坐标(x,y)(,号隔开):').split(',', 1)
            a = int(c_list[0])
            b = int(c_list[1])
            if (0 < a < x) and (0 < b < y):
                break
            else:
                continue
        except (EOFError, KeyboardInterrupt, ValueError):
            g.msgbox('您的输入有误')
    return a, b
sweeping()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-29 00:14:57 | 显示全部楼层
版主的easygui在哪里下载的?可不可以分享下?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-29 07:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表