找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3290|回复: 4

[讨论] 我没有修改这个变量,为什么它的值变了

2

主题

10

帖子

10

积分

贫民

积分
10
idontwan 发表于 2018-3-25 13:29:16 | 显示全部楼层 |阅读模式
我在看UCB的课程CS188,里面讲到给地图染色的问题,我根据它们讲的算法编了个程序
程序一直算不对,我找了好久,终于找到了问题出处
但是这个问题我觉得无法理解,难以修正

我会把整个程序已经运行程序需要的初始txt文件上传的
不过大家不用管整个程序
我遇到问题的地方在这里:
也就是原文件的45到81行
大家不用把这个全部理解,大家只用注意这么几行和这么几个变量就行了
注意正文代码的第10行:TempColor = self.ColorRecord[-1]
我建立了一个列表TempColor,给它赋值是self.ColorRecord列表的最后一个子列表
之后的逻辑大家不用管,但是可以看出,我只对TempColor这个变量进行了操作,没有动self.ColorRecord
然后大家注意正文代码的28到33行
我在29,30行还有32和33行加print的意思是确认程序进入了这个条件,并观察self.ColorRecord[0][15]的变化
大家注意,第31行只对TempColor这个变量进行了操作
但问题是,self.ColorRecord[0][15]它变了!!!而且就是安装第31行的指令变的
这让我非常奇怪
按照我的想法,这个值是不应该变的
根据我的算法和初始条件,当程序第一次迭代的时候,被修改的应该是self.ColorRecord[2][15]
我先让TempColor=self.ColorRecord[2],然后对TempColor进行操作
操作结束后最后删掉self.ColorRecord[2],再加上其他值
怎么也跟self.ColorRecord[0]无关吧,虽然第一次迭代的时候self.ColorRecord[0]和self.ColorRecord[2]具有相同的值
但是我只再第31行对TempColor进行了操作
然后再第31行前后输出self.ColorRecord[0][15]的值,却发生了改变
我真的不知道是怎么回事

  1.     def __next__(self):
  2.         self.iter += 1
  3.         print(self.iter)
  4.         #print(self.ColorRecord[1][15])
  5.         #print(self.path[1])
  6.         #print(self.ConnectRecord[1])
  7.         #print(self.CoNumRecord[1])
  8.         region = self.path[-1][-2]
  9.         add_color = self.path[-1][-1]
  10.         <font color="#ff0000">TempColor = self.ColorRecord[-1]</font>
  11.         TempConnect = self.ConnectRecord[-1]
  12.         TempConNum = self.CoNumRecord[-1]

  13.         list_node =[]
  14.         list_re_color = []
  15.         list_connect = []
  16.         TempColor[region] = add_color
  17.         TempConNum[region] = 0
  18.         #print(self.ColorRecord[1][15])
  19.         if TempConnect[region] == []:
  20.             if max(TempConNum) == 0:
  21.                 self.over =1
  22.             else:
  23.                 next_region = TempConNum.index(max(TempConNum))
  24.         else:
  25.             for node in TempConnect[region]:
  26.                 #print(self.ColorRecord[1][15])
  27.                 <font color="#ff0000">if add_color in TempColor[node]:
  28.                     print('s')
  29.                     print(self.ColorRecord[0][15])
  30.                     TempColor[node].remove(add_color)
  31.                     print('e')
  32.                     print(self.ColorRecord[0][15])</font>
  33.                 if TempColor[node] == []:
  34.                     del self.path[-1], self.ColorRecord[-1]
  35.                     del self.ConnectRecord[-1], self.CoNumRecord[-1]
  36.                     return self #? If satisify this condition, end this function and begin the next iter
复制代码

region_relationship.txt

322 Bytes, 下载次数: 0

初始条件

temp.py

4.73 KB, 下载次数: 0

全部代码

回复

使用道具 举报

2

主题

10

帖子

10

积分

贫民

积分
10
idontwan  楼主| 发表于 2018-3-25 18:00:46 | 显示全部楼层
本帖最后由 idontwan 于 2018-3-26 08:17 编辑

我把我的核心问题简化了一下,写了这么一个代码

  1. a=list(range(3))
  2. for i in range(3):
  3.     a[i] = list(range(2))
  4. t = a[-1]
  5. print(a[0],a[-1])
  6. t.remove(0)
  7. print(a[0],a[-1])

  8. class verify_:
  9.     def __init__(self):
  10.         self.a = list(range(5))
  11.         for i in range(5):
  12.             self.a[i] = list(range(5))
  13.         self.iter = 0

  14.     def __next__(self):
  15.         self.iter += 1
  16.         print(self.a)
  17.         t = self.a[-1]
  18.         t.remove(self.iter)
  19.         del self.a[-1]
  20.         for i in range(3):
  21.             self.a.append(t)
  22.         print(self.a)
  23.         return self

  24.     def __iter__(self):
  25.         return self


  26. V = verify_()
  27. for v in V:
  28.     if v.iter > 3:
  29.         break
复制代码


结果发现,果然是我对python的理解有问题,比如第6行对t操作确实改变了a[-1]的值
还有后面这个迭代器,得到的结果也不是我所估计的
附上结果
——-------------------------------------------------------------
运行值                                                    我想得到的结果
[0, 1] [0, 1]                                              [0, 1] [0, 1]
[0, 1] [1]                                                  [0, 1] [0, 1]

运行值:
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 2, 3, 4], [0, 2, 3, 4], [0, 2, 3, 4]]
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 2, 3, 4], [0, 2, 3, 4], [0, 2, 3, 4]]
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 3, 4], [0, 3, 4], [0, 3, 4], [0, 3, 4], [0, 3, 4]]

[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 3, 4], [0, 3, 4], [0, 3, 4], [0, 3, 4], [0, 3, 4]]
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 4], [0, 4], [0, 4], [0, 4], [0, 4], [0, 4], [0, 4]]

[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 4], [0, 4], [0, 4], [0, 4], [0, 4], [0, 4], [0, 4]]
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0], [0], [0], [0], [0], [0], [0], [0], [0]]

我想得到的结果:
[[0,1,2,3,4], [0,1,2,3,4], [0,1,2,3,4][0,1,2,3,4][0,1,2,3,4]]                                    
[[0,1,2,3,4], [0,1,2,3,4], [0,1,2,3,4][0,1,2,3,4][0,2,3,4][0,2,3,4][0,2,3,4]]   

[[0,1,2,3,4], [0,1,2,3,4], [0,1,2,3,4][0,1,2,3,4][0,2,3,4][0,2,3,4][0,2,3,4]]
[[0,1,2,3,4], [0,1,2,3,4], [0,1,2,3,4][0,1,2,3,4][0,2,3,4][0,2,3,4][0,3,4][0,3,4][0,3,4]]

[[0,1,2,3,4], [0,1,2,3,4], [0,1,2,3,4][0,1,2,3,4][0,2,3,4][0,2,3,4][0,3,4][0,3,4][0,3,4]]
[[0,1,2,3,4], [0,1,2,3,4], [0,1,2,3,4][0,1,2,3,4][0,2,3,4][0,2,3,4][0,3,4][0,3,4][0,4][0,4][0,4]]

[[0,1,2,3,4], [0,1,2,3,4], [0,1,2,3,4][0,1,2,3,4][0,2,3,4][0,2,3,4][0,3,4][0,3,4][0,4][0,4][0,4]]
[[0,1,2,3,4], [0,1,2,3,4], [0,1,2,3,4][0,1,2,3,4][0,2,3,4][0,2,3,4][0,3,4][0,3,4][0,4][0,4][0][0][0]]

回复 支持 反对

使用道具 举报

2

主题

10

帖子

10

积分

贫民

积分
10
idontwan  楼主| 发表于 2018-3-26 10:17:03 | 显示全部楼层
感觉我不管用什么,都不能不改变

  1. a=list(range(3))
  2. for i in range(3):
  3.     a[i] = list(range(2))
  4. t = a[-1]
  5. print(a[0],a[-1])
  6. t.remove(0)
  7. print(a[0],a[-1])

  8. b=list(range(3))
  9. for i in range(3):
  10.     b[i] = list(range(2))
  11. c = b
  12. s = c[-1]
  13. print(b[0],b[-1])
  14. s.remove(0)
  15. print(b[0],b[-1])
复制代码


输出结果:
[0, 1] [0, 1]
[0, 1] [1]

[0, 1] [0, 1]
[0, 1] [1]
回复 支持 反对

使用道具 举报

2

主题

10

帖子

10

积分

贫民

积分
10
idontwan  楼主| 发表于 2018-3-27 13:36:23 | 显示全部楼层
解决了
用copy.deepcopy方法
回复 支持 反对

使用道具 举报

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

本版积分规则

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