【发布时间】:2011-09-24 01:25:40
【问题描述】:
我有使用命令式语言(最常使用 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 *state 是我跟踪的状态标志,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 不是所有关于对象和一切都是通过引用调用的吗?
如果是这样,为什么我看不到副作用?
我迷路了。谁能解释一下这里发生了什么。
【问题讨论】:
-
“我有使用命令式语言的经验(最常见的是 C),这可能就是我在学习 python 时感到困惑的原因。”将一种语言的经验应用于另一种语言是一个坏主意。最好在开始每个语言教程时都空着脑袋,忘记所有您认为自己知道的以前的编程语言。
标签: python pass-by-reference primitive-types