Python:局部变量神秘地更新全局变量
我有一个函数,其中我处理一个局部变量,然后在函数完成后传回最终变量。我想在函数之前记录这个变量是什么,但是全局变量和局部变量一起更新。这是我的代码的缩写版本(相当长) 我的问题是,L和Lintial都是在Llocal更新时更新的,但我希望Lintial不要更改。P没有改变,所以我对这里发生的事情感到困惑。帮忙?谢谢Python:局部变量神秘地更新全局变量,python,variables,global,local,Python,Variables,Global,Local,我有一个函数,其中我处理一个局部变量,然后在函数完成后传回最终变量。我想在函数之前记录这个变量是什么,但是全局变量和局部变量一起更新。这是我的代码的缩写版本(相当长) 我的问题是,L和Lintial都是在Llocal更新时更新的,但我希望Lintial不要更改。P没有改变,所以我对这里发生的事情感到困惑。帮忙?谢谢 勇敢的人的全部代码都在这里:问题是p和L是名称,它们被绑定到对象,而不是值本身。当您将它们作为参数传递给函数时,实际上是将绑定的副本传递给P和L。这意味着,如果P和L是可变对象,对它
勇敢的人的全部代码都在这里:问题是p和L是
名称
,它们被绑定到对象
,而不是值本身。当您将它们作为参数传递给函数时,实际上是将绑定的副本传递给P和L。这意味着,如果P和L是可变对象,对它们所做的任何更改都将在函数调用之外可见
您可以使用该模块保存名称值的副本。列表是可变的。如果您将一个列表传递给一个函数,并且该函数修改了该列表,那么您将能够看到绑定到同一列表的任何其他名称的修改
要解决此问题,请尝试更改此行:
L = Linitial
为此:
L = Linitial[:]
此切片将生成列表的浅层副本。如果您从存储在L
中的列表中添加或删除项目,则不会更改列表Lintial
如果要制作深度复制,请使用
同样的事情不会发生在p上,因为它是一个整数。整数是不可变的。在Python中,变量只是对内存中对象或值的引用。例如,当您有一个列表x
:
x = [1, 2, 3]
因此,当您将x
赋值给另一个变量时,我们称之为y
,您只是为x
引用的对象创建了一个新的引用(y
)([1,2,3]
列表)
更新x
时,实际上是在更新x
所指向的对象,即列表[1,2,3]
。由于y
引用了相同的值,它似乎也被更新了
请记住,变量只是对对象的引用
如果确实要复制列表,应执行以下操作:
new_list = old_list[:]
这里有一个很好的解释:对象的类型是什么?你能给出一个完整的、自包含的可运行的例子来演示你所看到的吗?P是一个int,L是一个list。T也是int,of lag是bool。我只是通过IDLE的调试器发现了这个问题,它相当微妙。如果我显示全局变量和局部变量,我会看到L、Clinical和Llocal三个变量同时发生变化。我可以在这里上传整个代码,但它有几百行。我现在担心的部分是从190和57开始的。此时,它从第66行抛出一个错误,但错误的根本原因是此变量更新。请注意,建议保留大写字母
作为类名。@user1930726制作一个简短的(但可运行的)示例来说明问题。下次,使用或类似的工具来共享您的代码。:)需要注意的是,copy
是一个模块,而不是一个函数。我认为在这种情况下,理解函数接收指针并在与初始值相同的对象上操作就足够了。但是,不可变对象通常在赋值时隐式复制(例如数字和字符串),而可变对象将同一指针赋给新名称,因此有两个名称引用同一实例。@Nisan.H Python该语言没有“指针”的概念,因此这没有用(虽然实现cPython确实使用指针)。不可变对象不是“分配时复制的”。名称只是重新绑定到分配给的对象。我尝试使用copy.deepcopy和L=lintial[:]但我还是得到了和以前一样的错误。我正在使用调试器处理它,当我看到发生了什么时,我会发回。谢谢!它现在可以工作了!我实际上已经做了两次浅拷贝,一次是在我定义lintial,另一次是在我重新定义L时。谢谢!!
y = x
new_list = old_list[:]