2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Баг в Python
Сообщение10.07.2018, 15:18 
Ввожу в Python 3.6.1:
Используется синтаксис Python
x=[" ", " ", " ", "X", "X", "X", " ", "O", "O"]
print(x[0]==x[1]==x[2]=="X" + x[3]==x[4]==x[5]=="X")

Он почему-то выводит False. Это баг?

 
 
 
 Re: Баг в Python
Сообщение10.07.2018, 15:39 
Вообще интересно
Используется синтаксис Python
>>> y=1==1
>>> x=2==2
>>> print (y)
True
>>> print(x)
True
>>> print (x+y)
2
>>> print(1==1 + 2==2)
False
>>> print(y&x)
True

 

 
 
 
 Re: Баг в Python
Сообщение10.07.2018, 15:44 
Аватара пользователя
Предлагаю расставить скобки.

 
 
 
 Re: Баг в Python
Сообщение10.07.2018, 15:44 
Используется синтаксис Python
>>> 1==1&2==2
False
>>> (1==1)+(2==2)
2
>>> (1==1)&(2==2)
True
>>> 1==1&1==1
True
 

 
 
 
 Re: Баг в Python
Сообщение10.07.2018, 15:55 
Аватара пользователя
И лучше бы использовать логические операторы, а не битовые...

Используется синтаксис Python
>>> (1==1)|(2)
3
>>> (1==1)&(2)
0
>>> (1==1)and(2)
2

 
 
 
 Re: Баг в Python
Сообщение10.07.2018, 18:51 
kotenok gav в сообщении #1325670 писал(а):
Ввожу в Python 3.6.1:
Используется синтаксис Python
x=[" ", " ", " ", "X", "X", "X", " ", "O", "O"]
print(x[0]==x[1]==x[2]=="X" + x[3]==x[4]==x[5]=="X")

Он почему-то выводит False. Это баг?

Еще забыл написать. На это:
Используется синтаксис Python
print(x[0]==x[1]==x[2]=="X", x[3]==x[4]==x[5]=="X", (False + True)==True)

Python выводит "False True True". То есть это не может не быть багом. Этот баг известен? Писать о нем куда-то? Ван Россуму?

 
 
 
 Re: Баг в Python
Сообщение10.07.2018, 18:59 
kotenok gav
Вы уверены что операция + выполняется после операций ==? А проверить? Выше уже предложили расставить скобки и сравнить вывод. Подозреваю, даже полностью уверен так как проверил, ваш код выполняется так:
Используется синтаксис Python
print(x[0]==x[1]==x[2]==    ("X" + x[3])    ==x[4]==x[5]=="X")
А код
Используется синтаксис Python
print((x[0]==x[1]==x[2]=="X") + (x[3]==x[4]==x[5]=="X"))
выдаёт совершенно правильное значение "1" (0+1=1).

И обсуждать тут больше нечего. Вот от таких ошибок и спасает строгая типизация ...

 
 
 
 Re: Баг в Python
Сообщение10.07.2018, 21:49 
Аватара пользователя
kotenok gav в сообщении #1325711 писал(а):
Писать о нем куда-то?

Для начала, прочитать спецификацию. Затем привести конкретный пункт этой спецификации, который Вы назвали "багом"... либо описать, формально, несоответствие пошагового применения спецификации к данному выражению с получаемыми результатами.

 
 
 
 Re: Баг в Python
Сообщение10.07.2018, 22:38 
Аватара пользователя
Dmitriy40 в сообщении #1325712 писал(а):
Вот от таких ошибок и спасает строгая типизация
В питоне строгая типизация. Но причем она тут?
Тут два неочевидных момента: приоритет операций (более очевидный - все же пишут 2 + 2 == 4) и chain comparison.

(Про вопросы о сообщении о багах)

Баги в популярных интерпретаторах / компиляторах, конечно, встречаются. Но вплоть до очень высокого уровня шансов, что это вы чего-то не понимаете, гораздо больше.

 
 
 
 Re: Баг в Python
Сообщение11.07.2018, 01:33 
Да, исходное выражение строгая типизация (строгий контроль типов операндов) не спасёт, тут я перегнул. Но хотя бы False+True запретит, что стало бы намёком на причину непонимания.

 
 
 
 Re: Баг в Python
Сообщение11.07.2018, 01:41 
Аватара пользователя
Dmitriy40 в сообщении #1325769 писал(а):
Но хотя бы False+True запретит

Зачем? Допустим, мне нужно выполнение (любых) трёх условий из пяти...

Большая неприятность, как я её вижу, скорее в том, что true это единица...

 
 
 
 Re: Баг в Python
Сообщение11.07.2018, 01:46 
Geen
А давайте не будем в 100500-й раз обсуждать преимущества и недостатки строгой типизации (строгого контроля типов операндов)? Спасибо.

 
 
 [ Сообщений: 12 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group