为什么 python 列表不是本地的
Why are python lists not local
我认为所有 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 ]
因此,从技术上讲,当您将 pizza
传递给函数 f
时,您只是将指针复制到同一个列表,并创建一个不同的命名变量来引用。
是的,这个新创建的变量只能在f
范围内访问,所以是的,它是local。但是如果你以任何方式改变它的引用,就好像你在改变 pizza
本身一样,因为它们都指向同一个对象。
我认为所有 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 ]
因此,从技术上讲,当您将 pizza
传递给函数 f
时,您只是将指针复制到同一个列表,并创建一个不同的命名变量来引用。
是的,这个新创建的变量只能在f
范围内访问,所以是的,它是local。但是如果你以任何方式改变它的引用,就好像你在改变 pizza
本身一样,因为它们都指向同一个对象。