Перевірка, чи вводиться список == у python


185

У мене, можливо, тут є мозок перде, але я дійсно не можу зрозуміти, що з моїм кодом не так:

for key in tmpDict:
    print type(tmpDict[key])
    time.sleep(1)
    if(type(tmpDict[key])==list):
        print 'this is never visible'
        break

вихід - <type 'list'>але оператор if ніколи не спрацьовує. Хтось може помітити мою помилку тут?


3
Ви listдесь використовували як змінну? Будьте уважні, якщо ви працюєте в системі REPL або подібній, вона все ще може бути переосмислена деякий час тому.
Ffisegydd

..... Woooowww ... безумовно, урок щодо недоліків м'яко набраних мов. Нічого ...
Бенджамін Ліндквіст

Додайте його як відповіді, і я прийму. ДЯКУЮ.
Бенджамін Ліндквіст

1
Pylint та друзі допоможуть вам у майбутньому (я би не назвав це недоліком).

Відповіді:


140

Ваша проблема полягає в тому, що ви переосмислили listяк змінну раніше в своєму коді. Це означає, що коли ти, type(tmpDict[key])==listякщо повернешся, Falseбо вони не рівні.

Однак, слід замість isinstance(tmpDict[key], list)тестування типу чогось використовувати, це не уникне проблеми перезапису, listале є більш піфонічним способом перевірки типу.


Приємно. "Більш піфонічний" - це широке поняття. тільки заради освіти: що-є-чим відрізняються між типом-і -істотою?
Хаві

222

Спробуйте використати isinstance()

if isinstance(object, list):
       ## DO what you want

У вашому випадку

if isinstance(tmpDict[key], list):
      ## DO SOMETHING

Розробити:

x = [1,2,3]
if type(x) == list():
    print "This wont work"
if type(x) == list:                  ## one of the way to see if it's list
    print "this will work"           
if type(x) == type(list()):
    print "lets see if this works"
if isinstance(x, list):              ## most preferred way to check if it's list
    print "This should work just fine"

EDIT 1: Різниця між isinstance()і type()чому isinstance()найбільш переважним способом перевірки є те, що додатково isinstance()перевіряє підкласи, а type()поки ні.


22

Це, здається, працює для мене:

>>>a = ['x', 'y', 'z']
>>>type(a)
<class 'list'>
>>>isinstance(a, list)
True


0

Хоча це не так просто, як isinstance(x, list)можна було б використовувати:

this_is_a_list=[1,2,3]
if type(this_is_a_list) == type([]):
    print("This is a list!")

і мені подобається проста розумність цього

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.