的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