SORU
1 AĞUSTOS 2011, PAZARTESİ


Neden Python 3 dilim hala kopya ve görüşlerini değil mi?

Ben sadece şu anda görüş yerine sığ kopya Dilimleme this answer, Python 3 karşılığında dilimleri üzerine yorum sonra fark ettim. Neden hala bu durumda? Hatta bir kenara bırakarak numpy kullanım manzarası yerine kopyalar için Dilimleme, aslında dict.keys, dict.values dict.items Tüm iade görünümlerde Python 3, ve orada pek çok diğer yönlerini Python 3 dişli karşı daha fazla kullanım kullanımına, yapar gibi orada olurdu bir hareketi doğru dilimler haline benzer. itertools var islice işlev yapar yinelemeli dilim, ama bu daha sınırlı daha normal Dilimleme ve sağlamaz görünüm işlevsellik boyunca çizgiler dict.keys dict.values.

De, aslında kullanabileceğiniz atama dilimleri değiştirmek için orijinal liste, ama dilimler kendilerini kopyalar ve görüşleri, çelişkili yönü, dili gibi aykırı bazı ilkeleri resimli the Zen of Python.

Yani, yapabilirsin aslında

>>> a = [1, 2, 3, 4, 5]
>>> a[::2] = [0, 0, 0]
>>> a
[0, 2, 0, 4, 0]

Ama değil

>>> a = [1, 2, 3, 4, 5]
>>> a[::2][0] = 0
>>> a
[0, 2, 3, 4, 5]

ya da böyle bir şey

>>> a = [1, 2, 3, 4, 5]
>>> b = a[::2]
>>> b
view(a[::2] -> [1, 3, 5])   # numpy doesn't explicitly state that its slices are views, but it would probably be a good idea to do it in some way for regular Python
>>> b[0] = 0
>>> b
view(a[::2] -> [0, 3, 5])
>>> a
[0, 2, 3, 4, 5]

Biraz keyfi/istenmeyen gibi görünüyor.

Bildiğim kadarıyla http://www.python.org/dev/peps/pep-3099/ ve bir kısım var diyor "ve genişletilmiş Dilim dilim olmaz git (bile __getslice__ __setslice__ API, değiştirilebilir) ne olacak onlar geri görüş için standart nesne türleri.", ama bağlantılı tartışma sağlar bahsedilmiyor neden kararı hakkında Dilimleme ile görüş yapıldı; aslında, çoğunluğun yorumlar belirli bir öneri ortaya önerilerinde orijinal post fıstıklı olumlu.

Uygulanan olmak böyle bir şey olabiliyor özellikle kesinlikle geriye dönük uyumlu Python 2 ile olmamak için tasarlanan 3.0, Python.x ve böylece en iyi saat tasarımı böyle bir değişime uygun olurdu, ve orada Python sürümlerini bunu engelleyebilecek bir şey var mı?

CEVAP
1 AĞUSTOS 2011, PAZARTESİ


De, dilim atama orijinal listeyi değiştirmek için kullanabilirsiniz, ama dilim kendilerini kopya olması ve görüşlerini değil.

Böyle düşündüğünü anlayabiliyorum, ancak tam olarak doğru değil; Hmm... Diğer dilleri, dilim bir atama, gibi bir şey

a[b:c] = d

olur denk

tmp = a.operator[](slice(b, c)) # which returns some sort of reference
tmp.operator=(d)        # which has a special meaning for the reference type.

Ama python, ilk ifade aslında bu dönüştürülür:

a.__setitem__(slice(b, c), d)

Madde bir görev aslında özellikle python için özel bir anlam, ayrı madde arama yapmak tanınan bir terimve atama; ilgisiz olabilir. Bu python gibi kavramlar yoktur, çünkü bir bütün olarak python ile tutarlıdır< . em^"" . lvalues C/C ; atama operatörünün kendisini aşırı şekilde; tek atama sol tarafında düz bir tanımlayıcı değil, belirli durumlarda yok.

Listeler sanırımyaptıbir manzaraya sahip, Ve bunu kullanmaya çalıştım:

myView = myList[1:10]
yourList = [1, 2, 3, 4]
myView = yourList

Diller ayrıca python, olabilir bir şekilde kıpırdamak yourList myList ama python beri adı myView göründüğü gibi çıplak bir tanımlayıcı, tek demek istediğim bir değişken assignemnt; görünüm kaybolur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CareyHolzman

    CareyHolzman

    24 Ocak 2008
  • GWTLecturer

    GWTLecturer

    18 EKİM 2012
  • HereWeStayKings

    HereWeStayKi

    3 NİSAN 2013