的Python代码段是下面几行:Python:如何理解赋值和引用?
>>> values = [0, 1, 2]
>>> values[1] = values
>>> values
[0, [...], 2]
为什么值[0,[...],2]
,什么是...
?为什么价值不是[0,[0,1,2],2]
?
的Python代码段是下面几行:Python:如何理解赋值和引用?
>>> values = [0, 1, 2]
>>> values[1] = values
>>> values
[0, [...], 2]
为什么值[0,[...],2]
,什么是...
?为什么价值不是[0,[0,1,2],2]
?
[...]
意味着你自我引用变量本身(循环引用):
>>> values = [0, 1, 2]
>>> sys.getrefcount(values) #two references so far: shell and `values`
2
>>> values[1] = values #created another reference to the same object but a cyclic one
>>> sys.getrefcount(values) # references increased to 3
3
>>> values[1] is values # yes both point to the same obejct
True
现在您可以使用values
或values[1]
:
>>> values[1].append(4)
>>> values
[0, [...], 2, 4]
#or
>>> values[1][1][1].append(5)
>>> values
[0, [...], 2, 4, 5]
[...]是一个列表...在这种情况下列表中的列表。
您将第二项值分配给自身,以便插入(或引用)完整值列表。
一个简短的测试:
values = [0, 1, 2]
values[1] = values
print values
v = values[1]
print v
v[1] = 5
print values
打印
[0, [...], 2]
[0, [...], 2]
[0, 5, 2]
正如你可以看到,变更值时[1] [1](其中为v [1]))是不改变该特定的项目,但参考本身,否则它会是[0,[0,5,2],2]。
您创建了递归引用;您将索引1
中的项目替换为整个列表的参考。
要现在显示该列表,Python不会而是递归到嵌套的引用中,而是显示[...]
。
>>> values = [0, 1, 2]
>>> values[1] = values
>>> values
[0, [...], 2]
>>> values[1] is values
True
引用values[1]
是同样的事情作为参考values
,你可以做这样循环往复:
>>> values[1]
[0, [...], 2]
>>> values[1][1] is values
True
>>> values[1][1] is values[1]
True