Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:局部变量神秘地更新全局变量_Python_Variables_Global_Local - Fatal编程技术网

Python:局部变量神秘地更新全局变量

Python:局部变量神秘地更新全局变量,python,variables,global,local,Python,Variables,Global,Local,我有一个函数,其中我处理一个局部变量,然后在函数完成后传回最终变量。我想在函数之前记录这个变量是什么,但是全局变量和局部变量一起更新。这是我的代码的缩写版本(相当长) 我的问题是,L和Lintial都是在Llocal更新时更新的,但我希望Lintial不要更改。P没有改变,所以我对这里发生的事情感到困惑。帮忙?谢谢 勇敢的人的全部代码都在这里:问题是p和L是名称,它们被绑定到对象,而不是值本身。当您将它们作为参数传递给函数时,实际上是将绑定的副本传递给P和L。这意味着,如果P和L是可变对象,对它

我有一个函数,其中我处理一个局部变量,然后在函数完成后传回最终变量。我想在函数之前记录这个变量是什么,但是全局变量和局部变量一起更新。这是我的代码的缩写版本(相当长)

我的问题是,L和Lintial都是在Llocal更新时更新的,但我希望Lintial不要更改。P没有改变,所以我对这里发生的事情感到困惑。帮忙?谢谢


勇敢的人的全部代码都在这里:

问题是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[:]