我认为所有的python变量都是本地的。但是,我发现列表不是这种情况。在我看来这是非常危险的。
这段代码:
def f(piano):
piano[1]=3
print(piano)
pizza=[1,2]
f(pizza)
print(pizza)
输出:
[1,3]
[1,3]
如果列表是本地的,那应该是:
[1,3]
[1,2]
有人知道为什么会这样吗?
答案 0 :(得分:0)
从技术上讲,你是对的,因为piano
变量是本地的。但是,它仍然指向与pizza
相同的内部引用。
这就是幕后发生的事情:
您分配了一个新的值列表,并创建了一个名为pizza
的变量,以便您可以参考它:
pizza -> [ 1 , 2 ]
将此变量赋值给另一个变量时,只复制指向引用的指针,但引用本身仍然存在。
other_var = pizza
other_var -
|
pizza -----|--> [ 1 , 2 ]
因此,当您从技术上将pizza
传递给函数f
时,您只是将指针复制到同一列表,并创建一个不同的命名变量来引用。
是的,这个新创建的变量只能在f
范围内访问,所以是的,它是本地。但是如果你以任何方式改变它的引用,那就好像你在改变pizza
本身,因为它们都指向同一个对象。