我有以下代码和变量,我想查找变量<?php
if($response['error']['comment'])) echo "<p class='error'>".$response['error']['comment']."</p>";
,a
,a1
,a2
,b
和b1
在代码执行后引用。
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"]
任何人都可以告诉我我的错误吗?
答案 0 :(得分:7)
好的,您可以将Python中的变量视为参考。当你这样做时:
a1 = a
a1
和a
都是对同一对象的引用,因此如果您修改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)