Перевірка, чи вводиться список == у 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.