【发布时间】:2013-12-25 09:59:59
【问题描述】:
来自不太动态的 C++,我在理解这个 Python (2.7) 代码的行为时遇到了一些麻烦。
注意:我知道这是不好的编程风格/邪恶,但我还是想理解它。
vals = [1,2,3]
def f():
vals[0] = 5
print 'inside', vals
print 'outside', vals
f()
print 'outside', vals
这段代码运行没有错误,f 操纵(看似)全局列表。这与我之前的理解相反,即在函数中要操作(而不仅仅是读取)的全局变量必须声明为global ...。
另一方面,如果我将vals[0] = 5 替换为vals += [5,6],则执行将失败并显示UnboundLocalError,除非我将global vals 添加到f。这也是我在第一种情况下所期望的。
您能解释一下这种行为吗?
为什么我可以在第一种情况下操纵vals?为什么第二种操作会失败而第一种不会?
更新:
在评论中指出vals.extend(...) 可以在没有global 的情况下工作。这增加了我的困惑 - 为什么 += 与对 extend 的调用不同?
【问题讨论】:
-
我不是很喜欢python,但它是否允许在没有“全局”声明的情况下读取全局变量?我认为解释可能是分配给
vals[0]没有assign 给vals(它仍然是同一个数组),所以这样做vals[0]=5是一种阅读 i>. -
我认为这与更改变量引用的对象有关。我不明白为什么
vals.extend([5, 6])可以工作,而vals += [5, 6]不行,因为两者在列表方面基本相同。 -
@AntonKovalenko 它确实允许在没有全局语句的情况下阅读。来自一个 const 正确性的世界,让我感到困惑的是,两个改变值的操作似乎被完全不同地对待。
-
@Volatility:太棒了!我没试过。增加了我的困惑。
标签: python python-2.7 global-variables python-internals