Найти - Пользователи
Полная версия: Обработка ввода данных при присваивании
Начало » Python для новичков » Обработка ввода данных при присваивании
1
vananabu
день добрый. При вводе такого кода:
a[raw_input('Enter something')]=input('Enter another something')
сначала выдается запрос и ввод input, а затем raw_input. Почему такой порядок, а не наоборот? я так понимаю нужно углублятся в нюансы работы интерпритатора?
doza_and
vananabu
нужно углублятся в нюансы работы интерпритатора?
Не нужно. Постарайтесь воспользоваться здравым смыслом. Чтобы чтото присвоить его ведь надо иметь? те надо сначала вычислить, а потом уж класть на место.
Если вы посмотрите реализации на других языках программирования, c++, java, c#, pascal,…. во всех делается так.
vananabu
Вот, что нашел в википедии по поводу операции присваивания:
Алгоритм работы
Вычислить левостороннее значение первого операнда. На этом этапе становится известным местонахождение целевого объекта, приёмника нового значения.
Вычислить правостороннее значение второго операнда. Этот этап может быть сколь угодно большим и включать другие операторы (в том числе присвоения).
Присвоить вычисленное правостороннее значение левостороннему значению. Во-первых, при конфликте типов должно быть осуществлено их приведение (либо выдано сообщение об ошибке ввиду его невозможности). Во-вторых, собственно присваивания значения в современных языках программирования может быть подменено и включать не только перенос значений ячеек памяти (например, в «свойства» объектов в C#, перегрузка операторов).
Возвратить вычисленное правостороннее значение как результат выполнения операции. Требуется не во всех языках (например, не нужно в Паскале).
Возможно я не правильно понимаю, но тут же написано сначала вычислить слева, а затем справа..
doza_and
vananabu
но тут же написано сначала вычислить слева
Поправил wiki. Вообще компилятор может произвольно переставлять эти операции если сочтет это безопасным.
Читать лучше стандарт языка или спецификацию или проверять на референсной реализации.
#include <iostream>
#include <iomanip>
using namespace std;
class Tx
{
public:
    double v;
    double& operator[](int i)
    {
        cout<<"index of "<<v<<endl;
        return v;
    }
};
int main()
{
    Tx x[5];
    for(int i=0;i<5;++i){x[i].v=i+1;}
    x[0][0]=x[1][0]=x[2][0]=x[3][0]=x[4][0];
    return 0;
}
msvc 10:
index of 4
index of 5
index of 3
index of 2
index of 1
g++4.8
index of 1
index of 2
index of 3
index of 4
index of 5

class Tx(object):
    def __init__(self,i):
        self.v=i
    def __getitem__(self,i):
        print("get ",self.v)
        return self.v
    def __setitem__(self,i,v):
        print("set ",self.v)
        self.v=v
arr = [Tx(i) for i in range(5)]
arr[0][0]=arr[1][0]=arr[2][0]=arr[3][0]=arr[4][0]
('get ', 4)
('set ', 0)
('set ', 1)
('set ', 2)
('set ', 3)

мораль - не надо полагаться на не специфицированные вещи, иначе ваша программа может внезапно перестать работать.
vananabu
doza_and
Благодарю за объяснения, правы по поводу не специализированных источников. Сейчас уже понимаю смысл написанного. Родные docs дают исчерпывающие ответы.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB