一个通过循环设置数组的问题,请教各位高手帮助,谢谢。

jack_wq 2014-04-23 06:38:38
开始学习python,请各位指教。
Table_A = [0, 1, 2, 3]
Table_Temp = [0, 1, 2, 3, 4, 5, 6, 7]
for indexA in range(4):
for indexB in range(8):
Table_Temp[indexB] = [indexA, indexB]
Table_A[indexA] = Table_Temp
print Table_A


本来期望Table_A的最后结果是:
[[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7]], [[1, 0], [1, 1], [1, 2], [1, 1], [1, 4], [1, 5], [1, 6], [1, 7]], [[2, 0], [2, 1], [2, 2], [2, 2], [2, 4], [2, 5], [2, 6], [2, 7]], [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7]]]

但是实际上输出结果是:
[[[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7]], [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7]], [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7]], [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7]]]

也就是说Table_A[0] Table_A[1] Table_A[2] Table_A[3]都是一样的,实在找不出来原因,还请各位高手指教。
...全文
167 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
panghuhu250 2014-04-25
  • 打赏
  • 举报
回复
引用 4 楼 jack_wq 的回复:
谢谢各位,按照3楼的修改可以解决。 麻烦再问一下1楼,原来的code中,每次内部循环结束,Table_Temp都会被赋予新的数组值
Table_Temp的值没变,变的是它的内容。 想象有赵一,赵二,赵三,赵四四个人。Table_Temp是一个有八个格子的箱子。你填满8个格子,给了赵一(赵一记住了:我的箱子是Table_Temp)。你拿来同一个箱子,在8个格子里放上另外8个东西,给了赵二,...,最后,在同一个箱子里放上最后8个东西,给了赵四。这时你再问赵一,你的箱子里有什么?里面是你最后给赵四的8样东西! 1楼的办法是每次造一个新箱子。3楼的办法是给赵x之前复制一个新箱子给他们。都避免了“一女许两家”的问题。
howema 2014-04-25
  • 打赏
  • 举报
回复
学习......
jack_wq 2014-04-24
  • 打赏
  • 举报
回复
谢谢各位,按照3楼的修改可以解决。 麻烦再问一下1楼,原来的code中,每次内部循环结束,Table_Temp都会被赋予新的数组值,内部循环结束,这个数组值会赋给Table_A对应的索引值,按照这个思路,Table_A不同的下标对应的值应该是不同的啊,为真么这里是相同的呢?我通过打印Table_Temp可以看到,每次内部循环后这个数组的内容都是变化的,为什么最后赋值给外层循环的数组内容会是相同的呢?而且都是最后一次内部循环的结果?
angel_su 2014-04-24
  • 打赏
  • 举报
回复
试试改一行Table_A[indexA] = Table_Temp[:]
引用 1 楼 panghuhu250 的回复:
... python有更简练的表达办法:

In [28]: [[[i,j] for j in range(8)] for i in range(4)]
Out[28]: 
[[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7]],
 [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7]],
 [[2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7]],
 [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7]]]
fly 100% 2014-04-24
  • 打赏
  • 举报
回复
循环的层次错了
panghuhu250 2014-04-24
  • 打赏
  • 举报
回复
引用 楼主 jack_wq 的回复:
也就是说Table_A[0] Table_A[1] Table_A[2] Table_A[3]都是一样的
因为它们都是Table_Temp。外层循环每次开始时要构造一个新数组。

In [26]: def make_pairs(a, b):
    ...:     Table_A = range(a)
    ...:     for i in range(a):
    ...:         new_row = range(b)
    ...:         for j in range(b):
    ...:             new_row[j] = [i, j]
    ...:         Table_A[i] = new_row
    ...:     return Table_A
    ...: 

In [27]: make_pairs(4, 8)
Out[27]: 
[[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7]],
 [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7]],
 [[2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7]],
 [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7]]]
python有更简练的表达办法:

In [28]: [[[i,j] for j in range(8)] for i in range(4)]
Out[28]: 
[[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7]],
 [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7]],
 [[2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7]],
 [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7]]]

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧