在python中重新分配变量

时间:2015-04-22 22:15:18

标签: python

我有以下代码和变量,我想查找变量<?php if($response['error']['comment'])) echo "<p class='error'>".$response['error']['comment']."</p>"; aa1a2bb1在代码执行后引用。

b2

我尝试的解决方案如下:

def do_something(a, b):
    a.insert(0, "z")
    b = ["z"] + b

a = ["a", "b", "c"]
a1 = a
a2 = a[:]
b = ["a", "b", "c"]
b1 = b
b2 = b[:]

do_something(a, b)

但实际的解决方案是:

a = ["z", "a", "b", "c"]
a1 = ["a", "b", "c"]
a2 = ["a", "b", "c"]
b = ["z" "a", "b", "c"]
b1 = ["a", "b", "c"]
b2 = ["a", "b", "c"]

任何人都可以告诉我我的错误吗?

1 个答案:

答案 0 :(得分:7)

好的,您可以将Python中的变量视为参考。当你这样做时:

a1 = a

a1a都是对同一对象的引用,因此如果您修改a指向的对象,您会看到a1中的更改,因为 - 意外 - 它们是同一个对象(list.insert方法使列表变异)。

但是当你这样做时:

a2 = a[:]

然后a2是一个新的list个实例,当您修改a时,您不会修改a2

列表的+运算符的结果是一个新列表,所以当你这样做时:

b = ['z'] + b

您正在为b分配一个新列表,而不是像b那样就地改变b.insert('z')。现在b指向新对象,而b1仍然指向b的旧值。

但是范围甚至可能更棘手:您可以从函数中看到封闭范围,但是如果在函数内部分配变量,它将不会更改封闭中具有相同名称的变量(或全局或构建) -in)范围,它将在本地范围内创建一个具有此名称的变量。这就是为什么b没有被改变 - 好吧,不完全,Python中的参数传递是一个赋值操作,所以当有一个名为b的参数时,b已经是一个局部变量 - 但是试图改变一个在封闭范围内定义的变量会导致类似的问题。顺便说一句,依赖来自封闭范围的变量是不好的做法,除非它们是模块级常量(传统上它们以ALL_UPPERCASE样式命名,你不应该改变它们)。如果您需要函数内部的值,将其作为参数传递,并且您想要更改封闭范围中变量的值,返回值并在那里分配返回的值:

def do_something(a, b):
    a.insert(0, "z")  # mutates a in-place
    return ["z"] + b

b = do_something(a, b)