Python变量处理,我不明白

ele*_*ias 6 python variables

我无法找到关于这个非常简单的程序中发生的事情的简明信息:

print 'case 1'
# a and b stay different
a = [1,2,3]
b = a
b = [4,5,6]

print 'a =',a
print 'b =',b

print
print 'case 2'
# a and b becomes equal
a = [1,2,3]
b = a
b[0] = 4 
b[1] = 5 
b[2] = 6 

print 'a =',a
print 'b =',b
print

print 'case 3'
# a and b stay different now
a = [1,2,3]
b = a[:]
b[0] = 4 
b[1] = 5 
b[2] = 6 
print 'a =',a
print 'b =',b
print

print 'case 4'
# now the funny thing
a=[1,2,[3]]
b=a[:]
b[0]    = 4 
b[1]    = 5 
b[2][0] = 6 # this modifies b and a!!!
Run Code Online (Sandbox Code Playgroud)

这个简单测试的输出是:

case 1
a = [1, 2, 3]
b = [4, 5, 6]

case 2
a = [4, 5, 6]
b = [4, 5, 6]

case 3
a = [1, 2, 3]
b = [4, 5, 6]

case 4
a = [1, 2, [6]]
b = [4, 5, [6]]
Run Code Online (Sandbox Code Playgroud)

我显然不明白python如何处理每个案例.任何人都可以提供一个链接,以便我可以阅读它,或者对正在发生的事情做一个简短的解释吗?

非常感谢.

650*_*502 9

这是一个奇妙的python代码可视化工具.

在其中运行您的代码,一切都应该在一分钟内变得清晰.


jco*_*ado 6

这里有两件重要的事情:

  • 变量只是指向对象的标签
  • 列表在python中是可变的,而整数则不是.

当你发现这两个ab被修改,那么这是因为两者都指向同一个对象.你可以做id(a)id(b)确认这一点.

关于这些示例,请注意a[:]将创建一个新对象,该对象是一个副本a.但是,它将是浅拷贝,而不是深拷贝.这解释了为什么在示例4中,您仍然可以修改ab.它们指向不同的列表对象,但是一个元素是由它们共享的另一个列表.