onlar söylediklerin. Eğer Listeyi oluştururken ederken operasyon yapmak istiyorsanız yapabileceğiniz:
arr = [u + 1 for u in range(10)]
I (sürece Python 2 kullanıyorsanız, o zaman xrange
için range
değiştirmek Python 3. kullandığınız tahmin Python 2 range
işlevi gerçek bir list
döndürdüğü için liste boyutu çok küçüktür, ancak xrange
bir yineleyici döndürür; Python 3 range
işlevi, eski xrange
(ancak birkaç iyileştirme ile) benzeri bir yineleyici döndürür.
arr
varsa bir yeni list
nesne ile şimdiki list
nesneyi değiştirmeden değiştirmek istediğiniz list
mevcut yapabileceğiniz edilir
arr[:] = [u + 1 for u in arr]
İşte
arr
kullanma arasındaki fark gösterilmektedir bazı kod ve ödevin sol tarafında arr[:]
.
arr = list(range(10))
b = arr
print(id(arr), id(b))
arr = [u + 1 for u in arr]
print(id(arr), id(b))
print(arr, b)
c = arr
print(id(arr), id(c))
arr[:] = [u + 1 for u in arr]
print(id(arr), id(c))
print(arr, c)
çıkış
3073636268 3073636268
3073629964 3073636268
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3073629964 3073629964
3073629964 3073629964
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Yani arr = [u + 1 for u in arr]
Yeni bir liste nesnesine adını arr
bağlar, ancak arr[:] = [u + 1 for u in arr]
etkin mevcut liste nesnesi dönüşüyor. "Başlık altında" yeni bir geçici liste nesnesi oluşturur ve daha sonra içeriğini eski liste nesnesine kopyalar.
Yani ikincisi verimli mi? – Clausen
@Clausen: Aslında, aslında arr = [u + arr] için u + 1 yapmaktan biraz daha yavaştır, ancak liste büyük değilse hız farkını göremezsiniz. Ama arr [:] = 'işlevini kullanmanın en büyük avantajı, 'arr' için birden fazla referansınız varsa, Martijn'in cevabında açıkladığı gibi, geçerli olmaya devam edecektir. Eğer sadece 'arr = 'kullanırsanız, o zaman diğer referanslar güncel verilere değil, eski verilere ait olacaktır. –
@Clausen: Lütfen güncellenmiş yanıtıma bakın. –