找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1780|回复: 2

[求助] 奇怪的bug问题求教

2

主题

4

帖子

4

积分

贫民

积分
4
ronalchen 发表于 2019-1-20 23:33:53 | 显示全部楼层 |阅读模式
学习python中遇到一个奇怪的问题,实在没想明白,来此求教各位大神。


代码如下:


record = {
        'position': 0,  'club_name': '',  'game_played': 0,
        'win': 0,  'lose': 0,  'draw': 0,  'points': 0,  'goal_difference': 0}  #定义一个字典结构


table = []  #一个空白列表


clubs = ['利物浦', '曼城', '热刺', '切尔西', '阿森纳', '曼联'] #一个包含六个球队名字的列表


for number in range(len(clubs)):
        record['club_name'] = clubs[number]
        print(record)  
#用循环给字典的键赋值,运行到这里一切正常,结果显示出来六个‘club_name’与列表clubs对应的字典。
本来这个循环里我用了table.append(record)给列表table增加字典项,但奇怪的事情发生了。
怪事是,每循环一次,字典项确实增加了一个,但是会把前面已有的所有字典项的club_name键都修改成了与最新的字典项相同。
比如,循环第二次后有两个字典,但club_name都是曼城,第三次后三个字典的club_name都是热刺……到最后,六个字典的club_name都是曼联。
开始我以为是循环赋值引发的问题,于是有了下面的测试代码,使用了两个不同的字典变量测试。


print('\n')


record_0 = record
record_0['club_name'] = clubs[0]
print(record_0)
table.append(record_0)
print(table)
#运行结果,列表有一个字典,club_name是利物浦
print('\n')


record_1 = record
record_1['club_name'] = clubs[1]
print(record_1)
table.append(record_1)
print(table)
#问题依然发生,列表有两个字典,club_name都是曼城!!!?????
print('\n')



所以,问题是:为什么用append给列表增加一个字典的时候,会修改了之前已有的字典?完全搞不懂,求大神解答,,,谢谢!!!!
回复

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2019-1-21 14:33:36 | 显示全部楼层
要record的copy而不是引用如:
  1. for number in clubs:
  2.     record.update({'club_name':number})
  3.     table.append(record.copy())
  4. 结果
  5. [{'position': 0,
  6.   'club_name': '利物浦',
  7.   'game_played': 0,
  8.   'win': 0,
  9.   'lose': 0,
  10.   'draw': 0,
  11.   'points': 0,
  12.   'goal_difference': 0},
  13. {'position': 0,
  14.   'club_name': '曼城',
  15.   'game_played': 0,
  16.   'win': 0,
  17.   'lose': 0,
  18.   'draw': 0,
  19.   'points': 0,
  20.   'goal_difference': 0},
  21. {'position': 0,
  22.   'club_name': '热刺',
  23.   'game_played': 0,
  24.   'win': 0,
  25.   'lose': 0,
  26.   'draw': 0,
  27.   'points': 0,
  28.   'goal_difference': 0},
  29. {'position': 0,
  30.   'club_name': '切尔西',
  31.   'game_played': 0,
  32.   'win': 0,
  33.   'lose': 0,
  34.   'draw': 0,
  35.   'points': 0,
  36.   'goal_difference': 0},
  37. {'position': 0,
  38.   'club_name': '阿森纳',
  39.   'game_played': 0,
  40.   'win': 0,
  41.   'lose': 0,
  42.   'draw': 0,
  43.   'points': 0,
  44.   'goal_difference': 0},
  45. {'position': 0,
  46.   'club_name': '曼联',
  47.   'game_played': 0,
  48.   'win': 0,
  49.   'lose': 0,
  50.   'draw': 0,
  51.   'points': 0,
  52.   'goal_difference': 0}]
复制代码
回复 支持 反对

使用道具 举报

2

主题

4

帖子

4

积分

贫民

积分
4
ronalchen  楼主| 发表于 2019-1-21 21:59:46 | 显示全部楼层
sheeboard 发表于 2019-1-21 14:33
要record的copy而不是引用如:

学到,谢谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

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