Python:如何理解赋值和引用?

时间:2013-05-03 10:35:32

标签: python variable-assignment

python代码部分是以下几行:

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

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

3 个答案:

答案 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

现在,您可以使用valuesvalues[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]。