python-3.x - 列表中的 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]]
解决方案
赋值语句有两部分,左侧和右侧。首先计算右侧,然后计算左侧,然后将右侧分配给左侧,必要时通过元组解包。
就这样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] = x
和x[1] = 'd'
.
所以我们最终得到x = ['a', 'd']
,a = [x, x, 'd']
和b = [x, ['c']]
。['c']
不是,因为 in 中的x
第二个列表a
没有发生突变,它被替换为 ina
但不是 in b
。
推荐阅读
- java - 如何使用java合并json中的重复键
- clang - 链接后如何获取位码llvm?
- cpu-architecture - 在 AVR 微控制器中将寄存器作为内存的一部分有什么好处?
- python-3.8 - urllib3.exceptions.ProxySchemeUnknown:不支持代理方案无
- python - 加载张量流图像并创建补丁
- go - 如何确保 goroutine 在 main() 之前退出?不使用 WaitGroup
- data-structures - 使用堆栈删除序列中连续的相同字符
- javascript - 按钮停止使用绝对位置 React Native
- c# - .Net Core 中的授权/角色属性
- git - 需要删除远程提交,该提交是已关闭合并请求中显示的已删除分支的一部分