3

python代码部分是以下几行:

>>> values = [0, 1, 2]
>>> values[1] = values
>>> values
[0, [...], 2]

为什么价值是[0,[...],2],什么是...?为什么值不是[0,[0,1,2],2]

4

3 回答 3

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
于 2013-05-03T10:37:27.503 回答
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]
于 2013-05-03T10:37:31.930 回答
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]

如您所见,当更改 values[1][1](即 v[1]))时不会更改该特定项目,而是更改引用本身,否则它将是 [0, [0, 5, 2] , 2]。

于 2013-05-03T10:37:10.600 回答