python的浅复制
天天用着python写代码,但是其实很多东西原理都不是很清楚,还是得知其所以然,否则处处踩坑
关键词:递归、列表、set,边遍历边修改
边遍历边修改是一件很危险的行为,小白无知,竟然大胆的使用了,还莫名其妙work了,然后进入了细致的分析。
第一种情况
def backtracing(index):
global col_left
print("global",id(col_left))
if index>3:
return
else:
for icol in col_left:
print("index",index)
print("icol",icol)
print("col_left",col_left)
print("first_id",id(col_left))
col_left = [j for j in col_left if j!=icol]
print("col_left",col_left)
print("second_id",id(col_left))
backtracing(index+1)
global col_left
col_left = []
col_left.append(0)
col_left.append(1)
col_left.append(2)
backtracing(0)
结果,可以看到,虽然边遍历,边修改列表,但是不影响第一次的循环
global 2191769569536
index 0
icol 0
col_left [0, 1, 2]
first_id 2191769569536
col_left [1, 2]
second_id 2191769379904
global 2191769379904
index 1
icol 1
col_left [1, 2]
first_id 2191769379904
col_left [2]
second_id 2191769373504
global 2191769373504
index 2
icol 2
col_left [2]
first_id 2191769373504
col_left []
second_id 2191769569280
global 2191769569280
index 1
icol 2
col_left []
first_id 2191769569280
col_left []
second_id 2191769373504
global 2191769373504
index 0
icol 1
col_left []
first_id 2191769373504
col_left []
second_id 2191769379904
global 2191769379904
index 0
icol 2
col_left []
first_id 2191769379904
col_left []
second_id 2191769373504
global 2191769373504
这么牛的代码我都不知道怎么写出来的,既设置了global变量,还在循环里面col_left = [j for j in col_left if j!=icol]
不停地复制给一个新的变量。作为一个骚操作的案例吧。
前向操作看懂了,大概就是每次改变都赋予了一个新的地址,所以原来地址的值并没有改变,但是反向操作没看懂,看起来是个堆栈操作,暂时不管,可能涉及更底层的原理了。
总之:千万别边遍历边修改。