3 回答

TA貢獻1847條經驗 獲得超11個贊
區別是相當大的!在
a_list[:] = ['foo', 'bar']
您修改綁定到名稱的現有列表a_list。另一方面,
a_list = ['foo', 'bar']
為名稱分配一個新列表a_list。
也許這會有所幫助:
a = a_list = ['foo', 'bar'] # another name for the same list
a_list = ['x', 'y'] # reassigns the name a_list
print a # still the original list
a = a_list = ['foo', 'bar']
a_list[:] = ['x', 'y'] # changes the existing list bound to a
print a # a changed too since you changed the object

TA貢獻1836條經驗 獲得超4個贊
通過分配給a_list[:],a_list仍引用相同的列表對象,但內容已修改。通過分配給a_list,a_list現在引用一個新的列表對象。
查看其id:
>>> a_list = []
>>> id(a_list)
32092040
>>> a_list[:] = ['foo', 'bar']
>>> id(a_list)
32092040
>>> a_list = ['foo', 'bar']
>>> id(a_list)
35465096
如您所見,它id不會隨切片分配版本而改變。
兩者之間的不同可能導致完全不同的結果,例如,當列表是函數的參數時:
def foo(a_list):
a_list[:] = ['foo', 'bar']
a = ['original']
foo(a)
print(a)
與此同時,a也進行了修改,但是如果 a_list = ['foo', 'bar']改用了它,則a保留其原始值。
添加回答
舉報