2016-04-13 15 views
1

Ben 6 pozisyonlarında burada iki olası sonuçların bütün olası düzenlemeleri üreten ediyorum:Yeniden atama davranışı nasıl ortaya çıkıyor?

paths = list(it.product([['ax','r',[],0], ['ax','l',[],0]], repeat=6)) 

Ne oluşturması gerektiğini bir şey gibi: is

(['ax', 'r', [], 0], ['ax', 'r', [], 0], ['ax', 'r', [], 0], ['ax',  
'r', [], 0], ['ax', 'r', [], 0], ['ax', 'r', [], 0]) 

listesinin bir unsuru tümünü ihtiva etmektedir çıktıları. Sonuç şey

for path in paths: 
    axis = 1 
    for axis_slice in path: 
     if(axis%3 == 1): 
      axis_slice[0] = 'yp' 
      print(axis_slice[0]) 
     elif(axis%3 == 2): 
      axis_slice[0] = 'p' 
      print(axis_slice[0]) 
     elif(axis%3 == 0): 
      axis_slice[0] = 'xp' 
      print(axis_slice[0]) 
     axis+=1 
    print("axis: "+str(axis)) 
    print(path) 

olduğunu Bununla:

Ben tekrarlayan desen bu böyle bir şey yazdım İçin
'yp', 'p', 'xp'

göre artık 'balta' dizesini değiştirmek istiyorum Bunun gibi:

(['xp', 'r', [], 0], ['xp', 'r', [], 0], ['xp', 'r', [], 0], ['xp', 'r', [], 0], ['xp', 'r', [], 0], ['xp', 'r', [], 0]) 

Yine de yukarıdaki satırlardaki yazdırma ifadeleri bana doğru olduklarını gösteriyor. henüz geri bir 'seviyesini' atama ('yp', 'p', 'xp')

yp 
p 
xp 
yp 
p 
xp 
axis: 7 
(['xp', 'r', [], 0], ['xp', 'r', [], 0], ['xp', 'r', [], 0], ['xp', 'r', [], 0], ['xp', 'r', [], 0], ['xp', 'r', [], 0]) 

nasıl bu davranış ortaya etmez uzaklaşan gidiyor, ssigned? Neden iç döngüde değil, dış döngüde görünür? Değerlendirme sırasına ve tuple/listelerin paketlenme şekline sahip bir şey olabileceğini düşünüyorum.

Hedeflenen çıktı nasıl elde edilebilir?

+0

Düzenleme için teşekkürler Bhargav Rao. Gelecek gönderideki hatalardan kaçınacağım! – Daniyal

+0

Gerçekten de, yığın akışındaki girinti yanlıştı. İpucu için teşekkürler! Orijinal kaynağında girinti doğrudur :) Yolla ilgili olarak: her yol, tuple elemanları olarak listelerin bir listesidir. Evet, tuples (afaik) değilken listeler değiştirilebilir. :) – Daniyal

+1

Sadece bir düşünce.Itertools.product' içinde tam listeleri kullanamazsınız ve herhangi bir endeksleme işyeri olmayacak şekilde 'tekrarı 'azaltabilirsiniz. –

cevap

1

Sorununuz, paths numaralı path içindeki listelerdeki tüm üyelerin aynı nesnedir. Bunu kendiniz doğrulamak için şunu deneyin:

import itertools as it 
paths = list(it.product([['ax','r',[],0], ['ax','l',[],0]], repeat=6)) 
for path in paths: 
    print([id(p) for p in path]) 
Bu, yoldaki her listenin benzersiz tanımlayıcısını yazdırır. Sadece iki kimliğinizin olduğunu göreceksiniz - it.product'a geçtiğiniz orijinal iki listenin kimlikleri. İlk yol alırsak

Yani, örneğin,:

(['ax', 'r', [], 0], ['ax', 'r', [], 0], ['ax', 'r', [], 0], ['ax', 'r', [], 0], ['ax', 'r', [], 0], ['ax', 'r', [], 0]) 

Aslında aynı listeye 6 referansların başlık olur. Böylece, onların içinden geçerken, her seferinde aynı listeyi değiştirirsiniz. Her değiştirdiğinizde axis_slice[0] yerine print(path) yazarsanız ne olduğunu açıkça göreceksiniz - her 6 path üyesi her seferinde değişecektir. Bu, liste mutabilitesinin bir özelliğidir ve değiştirilebilir üyelere sahip bir listede itertools.product'u kullanır. Bu etki Python ve SO veteran Ned Batchelder here tarafından gerçekten iyi karşılanmaktadır. Özellikle - "Mutable aliasing" adı verilen slayta ve aşağıdakilere bakın - makalenin tamamı okunmaya değer.

Bu sorunun etrafından nasıl geçeceğiniz, bu kodun içeriğine büyük ölçüde bağımlı olacaktır.

+0

Mükemmel açıklama. Bu etki ile ilgili kaynaklar için çok teşekkürler! Bu durumda da katkılarınız için J Richard Snape ve C Panda'ya çok teşekkürler! – Daniyal

İlgili konular