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