python代码部分是以下几行:
>>> values = [0, 1, 2]
>>> values[1] = values
>>> values
[0, [...], 2]
为什么价值为[0,[...],2]
,什么是...
?为什么价值不是[0,[0,1,2],2]
?
答案 0 :(得分:3)
您创建了一个递归引用;您使用对整个列表的引用替换了索引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
答案 1 :(得分:3)
[...]
表示您自己将变量引用到自身(循环引用):
>>> 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]
答案 2 :(得分:2)
[...]是一个列表......在这种情况下是列表中的列表。
您将第二项值分配给自身,以便插入(或引用)完整值列表。
简短测试:
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]。