python代码部分是以下几行:
>>> values = [0, 1, 2]
>>> values[1] = values
>>> values
[0, [...], 2]
为什么价值是[0,[...],2]
,什么是...
?为什么值不是[0,[0,1,2],2]
?
python代码部分是以下几行:
>>> values = [0, 1, 2]
>>> values[1] = values
>>> values
[0, [...], 2]
为什么价值是[0,[...],2]
,什么是...
?为什么值不是[0,[0,1,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
[...]
意味着您将变量自我引用到自身(循环引用):
>>> 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]
如您所见,当更改 values[1][1](即 v[1]))时不会更改该特定项目,而是更改引用本身,否则它将是 [0, [0, 5, 2] , 2]。