找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 4003|回复: 3

[已解决] 哥子些,用随机数遇到问题了,求帮忙看看哈!!!

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2016-11-28 22:01:16 | 显示全部楼层 |阅读模式
鼓捣了好久,终于发现好像是列表定义出了问题,[[0]*n]*n这样定义的列表,在进行子列表更改时,貌似所有的子列表都在同时变化。。。
刚刚想写一个东东,有一部分是做一个随机的列表,列表的形式大概是[[0]*n]*n,
用随机数处理替换0后,发现随机生成的每个子列表居然是一样的
这部分代码如下:
  1. # coding=UTF-8
  2. import os
  3. import sys
  4. import random
  5. import time
  6. def a(n = 9):
  7.     #os.system('cls')
  8.     global aa
  9.     aa = [[0]*n]*n
  10.    
  11.     b(n)
  12.     for i in range(n):
  13.         for j in range(n):
  14.             print (str(aa[j][i]) + '  '),
  15.             time.sleep(0.01)
  16.         print
  17. def b(n):
  18.     for i in range(n):
  19.         aa[i].remove(0)
  20.         for j in range(n-len(aa[i])):
  21.             aa[i].insert(0,random.choice([1,2,3,4,5]))

  22. a()

复制代码
打印出来是这样滴。。。。
5   5   5   5   5   5   5   5   5
1   1   1   1   1   1   1   1   1
2   2   2   2   2   2   2   2   2
3   3   3   3   3   3   3   3   3
2   2   2   2   2   2   2   2   2
5   5   5   5   5   5   5   5   5
4   4   4   4   4   4   4   4   4
1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   1

求各位帮看看这是咋个滴咯。。。。
回复

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2016-11-30 19:45:22 | 显示全部楼层
鼓捣了好久,终于发现好像是列表定义出了问题,[[0]*n]*n这样定义的列表,在进行子列表更改时,貌似所有的子列表都在同时变化。。。

这是找到原因了吗?
回复 支持 反对

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb  楼主| 发表于 2016-12-1 14:43:11 | 显示全部楼层
blueelwang 发表于 2016-11-30 19:45
这是找到原因了吗?

确实是这样,不知道Python就是这样设计的还是其他的原因,使用 a = [[0]*]*n 这样定义嵌套列表,给任意一个子列表(a)的任意元素(a[j])赋值,其他子列表的相应位置(a[x][j])也会赋予相同的值....
QQ截图20161201143833.png
2.png
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2016-12-1 19:13:57 | 显示全部楼层
uitb 发表于 2016-12-1 14:43
确实是这样,不知道Python就是这样设计的还是其他的原因,使用 a = [[0]*]*n 这样定义嵌套列表,给任意一 ...

嗯, 我试了下, 确实存在这个问题, python3.5下也是这样。
那么就说明一个问题, 这种方式生成的列表, 其实内存地址是只向同一个地址的。
  1. >>> id(a)
  2. 4410833544
  3. >>> id(a[0])
  4. 4410833736
  5. >>> id(a[1])
  6. 4410833736
  7. >>> id(a[2])
  8. 4410833736
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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