Python是與第一類功能的面向對象的語言。它不像C那樣處理指針。列表條目本身不是對象,因此您需要同時持有一個項索引和一個對容器的引用,以執行您描述的那種插槽處理。有這樣做的軟件包,例如buffers,memory views或numpy ndarrays,但它需要一個間接層,因爲foo = something
表單的分配將綁定名稱foo,而不是修改foo用於引用的內容。
這裏就是這樣一個間接類的一個實例:
class Indirect(object):
def __init__(self, container, item):
self.container = container
self.item = item
@property
def value(self):
return self.container[self.item]
@value.setter
def value(self, value):
self.container[self.item] = value
l = [1,2,3]
ref = Indirect(l, 1)
ref.value = 5
print(l)
第一類功能支持意味着您也可以動態創建一個功能您需要的具體任務:
l = [1,2,3]
def callwith5(func): # doesn't know what func does
return func(5)
setanitem = lambda i: l[1]=i # creates a new function
callwith5(setanitem)
print(l)
表達這種差異的另一種方式是Python在C術語中並不真正擁有lvalue
;我們只是有一個賦值語句翻譯成不同的調用幾個語法擴展:
a = 1 # if a is global: setitem(globals(), 'a', 1)
a = 1 # otherwise: setitem(locals(), 'a', 1)
foo.a = 1 # setattr(foo, 'a', 1) => foo.__setattr__('a', 1)
l[1] = 5 # setitem(l, 1, 5) => l.__setitem__(1, 5)
他們中許多人進行了優化,使得沒有setitem,SETATTR等的查詢,而這些又將有一組規則引用到具體的方法如__setitem__
和__setattr__
,但最終規則是所有東西都是通過某個對象訪問的,其根是模塊字典。
不,您所描述的行爲是不可能在Python。 – CoryKramer 2014-11-14 13:11:45
好的。對於兩個指向相同值的列表,是否沒有其他possility?但是一個列表只是另一個列表的一個子集。 – char0n 2014-11-14 13:17:39
只有列表中的值是可變的。 – jonrsharpe 2014-11-14 13:19:24