У меня есть опыт работы с императивными языками (C чаще всего), и, вероятно, поэтому я запутался в изучении Python.
Я пытаюсь реализовать простые побитовые функции установки флага. Так что в C это будет выглядеть так:
void set_state(int *state, int var, int set)
{
(set)? *state |= var : *state &= ~var
}
int is_state(int *state, int var)
{
return (*state & var > 0)
}
int * состояние относится к флагу состояния, который я отслеживаю, а var - это флаг, который я хотел бы установить или очистить (определяется с помощью int set).
Поэтому я попытался сделать то же самое с Python 3.2 и ...
def setState(nState, nVar, bSet):
if bSet:
nState |= nVar
else:
nState &= ~var
print(nState)
Тогда я побежал ...
>>> state
1024
>>> nfirst
1
>>> nsecond
2
>>> setState(state, nfirst, True)
1025
>>> state
1024
отладчик говорит мне, что значение 'state' было скопировано в nState, а теперь nState мутировал сам (то есть он был изменен в своей локальной области видимости). Разве Python не все об объектах и все-это-по-ссылке?
Если так, то почему я не вижу побочный эффект?
Я потерян. Может кто-нибудь объяснить, что здесь происходит.