鱼C论坛

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

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

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

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

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

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

  3. import easygui as g
  4. import random
  5. import pickle


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

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

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


  48. def matrix(x, y):
  49.     """根据传入的参数定义矩阵,然后将矩阵返回"""
  50.     matrix_list = []
  51.     for i in range(y):
  52.         matrix_list.append([])
  53.         for j in range(x):
  54.             matrix_list[i].append([])
  55.     for i in range(y):
  56.         for j in range(x):
  57.             if i == 0:
  58.                 matrix_list[i][j] = j
  59.             elif j == 0:
  60.                 matrix_list[i][j] = i
  61.             else:
  62.                 matrix_list[i][j] = (i, j)
  63.     return matrix_list

  64. def c_input(x, y):
  65.     """对输入坐标做判断"""
  66.     while True:
  67.         try:
  68.             c_list = input('请输入坐标(x,y)(,号隔开):').split(',', 1)
  69.             a = int(c_list[0])
  70.             b = int(c_list[1])
  71.             if (0 < a < x) and (0 < b < y):
  72.                 break
  73.             else:
  74.                 continue
  75.         except (EOFError, KeyboardInterrupt, ValueError):
  76.             g.msgbox('您的输入有误')
  77.     return a, b
  78. sweeping()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-4-29 00:14:57 | 显示全部楼层
版主的easygui在哪里下载的?可不可以分享下?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-22 23:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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