首页 > 解决方案 > 列表中的 Python 框和指针

问题描述

我正在为我最后一个学期的书面论文而学习。我被教导使用箱形图和指针图来追踪列表的变化。但是,我遇到了一个问题,我的方法不起作用。

#Main code 1
a = [1, 2]
b = [a, a]
c = a.copy()
c[0], a[1] = b[1], c[0] #replace this

#code A
##c[0]=b[1]
##a[1]=c[0]

#code B
##a[1]=c[0]
##c[0]=b[1]

print(a)
print(b)
print(c)

##Normal Output/Code B
##[1, 1]
##[[1, 1], [1, 1]]
##[[1, 1], 2]

##Code A output
##[1, [...]]
##[[1, [...]], [1, [...]]]
##[[1, [...]], 2]

主要代码按原样编写,给出的答案如Normal Output(Python3 IDLE 证明)所示。当我在纸上进行跟踪时,我认为代码会产生Code A output

有什么我在这里遗漏的知识吗?

以下是我的跟踪方法所处理的其他一些类似的突变问题,但我无法得出任何差异来解释为什么这种行为只出现在第一个代码中。

#Code2 where switching line 3 like code 1 doesn't matter
a = [['a', 'b'], ['c'], 'd']
b = a[:-1]
a[1], b[0][1] = b[0], a[2] #switch this
print(a)
print(b)

##[['a', 'd'], ['a', 'd'], 'd']
##[['a', 'd'], ['c']]

#Code3 that has the same output even with a 1 liner replacement
a = [1,2,3]
b = [a,3,4]
a[2] = b
b[0][0] = b
a[0][1] = 99
a[2][0] = 5
#a[2],b[0][0],a[0][1],a[2][0]=b,b,99,5 #1 liner replacement
print(a)

#[[5, 99, 4], 2, [5, 99, 4]]

标签: python-3.x

解决方案


赋值语句有两部分,左侧和右侧。首先计算右侧,然后计算左侧,然后将右侧分配给左侧,必要时通过元组解包。

就这样c[0], a[1] = b[1], c[0]变成了c[0], a[1] = (a, 1)。那么c[0] = a,那么a[1] = 1

所以你最终得到了最终的结果c == [[1, 1], 2]a == [1, 1]b == [a, a]仍然。

这里要实现的关键是1, 2, 3元组的语法。

a, b = 1, 2并且a, b = (1, 2)完全相同,只是在大多数情况下,周围都有运算符要求您为元组元素加上括号。

a[0]如果我们给它自己的变量名,则更容易遵循该示例。所以

x = ['a', 'b']
a = [x, ['c'], 'd'] 
b = a[:-1]  

然后a[1], b[0][1] = b[0], a[2]-> a[1], b[0][1] = x, 'd'->a[1] = xx[1] = 'd'.
所以我们最终得到x = ['a', 'd'],a = [x, x, 'd']b = [x, ['c']]['c']不是,因为 in 中的x第二个列表a没有发生突变,它被替换为 ina但不是 in b


推荐阅读