Объект класса появляется в операторе if и else в цикле for. Почему? - PullRequest
0 голосов
/ 13 февраля 2019

Почему объект класса с параметром = "first" появляется в списке btest и в списке ctest?

У меня проблема с большим фрагментом кода, поэтому я написал этот меньший фрагментчтобы лучше понять, как эти операторы if / else работают в цикле for со списком объектов класса.Но я до сих пор не понимаю.

class test:
   def __init__(self,option,place):
       self.option=option
       self.place=place

   def __repr__(self):
       return("option:"+self.option+"\npalce:"+self.place)


optionlist=["first","second","thrid","fourth"]
placelist=["switzerland","germany","thailand","italy"]
testlist=[]

item=0
while item <len(optionlist):
   testl=test(optionlist[item],placelist[item])
   testlist.append(testl)
   item+=1

btest=[]
ctest=[]

for x in testlist:
    if x.option=="first":
       btest.append(x)
       print("here")       
    if x.option=="second": 
        print("here2") 

        # If I delete this 2nd if statement the ctest list
        # doesn't contain a object with option="first", but if I
        # leave it it does. Why?
    else:
        ctest.append(x)
        print("no")

print("btest:",btest)
print("ctest:",ctest)

Если я позволю этому коду запускаться * без 2-го оператора if, он даст мне следующий вывод:

here
no
no
no
btest: [option:first
palce:switzerland]
ctest: [option:second
palce:germany, option:thrid
palce:thailand, option:fourth
palce:italy]

Ну, этотакже то, что я ожидал, но почему это дает следующий вывод, если я позволю ему запускаться * со вторым оператором if:

here
no
here2
no
no
btest: [option:first
palce:switzerland]
ctest: [option:first
palce:switzerland, option:thrid
palce:thailand, option:fourth
palce:italy]

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Поскольку вы кодировали его, чтобы сделать это так:

if x.option=="first": 
   btest.append(x)               # when x.option == "first" add to btest
   print("here")       

if x.option=="second": 
    print("here2") 
else:
    ctest.append(x)              # when x.option NOT "second" add to ctest
    print("no")                  #      x.option == "first" is NOT second - so added

Вы можете изменить его на if: elif: else: ... тогда second никогда не будет добавлено ни к чему, потому что оно только print S

0 голосов
/ 13 февраля 2019

Потому что это два разных оператора if.Похоже, вам нужно использовать if/elif/else:

    if x.option=="first":
       btest.append(x)
       print("here")       
    elif x.option=="second": 
        print("here2") 

        # If I delete this 2nd if statement the ctest list
        # doesn't contain a object with option="first", but if I
        # leave it it does. Why?
    else:
        ctest.append(x)
        print("no")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...