Python函数参数范围(字典与字符串)

Python函数参数范围(字典与字符串),python,Python,foo=“foo” def bar(foo): foo=“bar” 我有一个函数,当我传递字典时,它无意中过度编写了我的函数参数。是否有一种干净的方法来声明我的参数为常量,或者我是否在函数中复制字典 谢谢 参数是按值传递的,但在本例中,值是对对象的引用。这也叫,。是的,如果您需要一个新的字典,您必须在函数中创建一个。参数是通过值传递的,但在这种情况下,值是对对象的引用。这也叫,。是的,如果你需要一个新的字典,你必须在函数中创建一个。在这种情况下,如果你想更改字典,你必须复制字典,并将更改保留在函

foo=“foo” def bar(foo): foo=“bar”

我有一个函数,当我传递字典时,它无意中过度编写了我的函数参数。是否有一种干净的方法来声明我的参数为常量,或者我是否在函数中复制字典


谢谢

参数是按值传递的,但在本例中,值是对对象的引用。这也叫,。是的,如果您需要一个新的字典,您必须在函数中创建一个。

参数是通过值传递的,但在这种情况下,值是对对象的引用。这也叫,。是的,如果你需要一个新的字典,你必须在函数中创建一个。

在这种情况下,如果你想更改字典,你必须复制字典,并将更改保留在函数的本地


原因是,当您将字典传递到第二个
bar
函数时,Python只传递对字典的引用。因此,当您在函数内部修改它时,您正在修改存在于函数外部的同一对象。另一方面,在第一个
bar
函数中,当您编写
foo=“bar”
时,为函数内的名称
foo
指定一个不同的对象。执行此操作时,函数中的名称
foo
开始引用字符串
“bar”
,而不是字符串
“foo”
。您已更改名称所指的对象。但是函数内部的
foo
和函数外部的
foo
是不同的名称,因此如果在函数内部更改标记为
foo
的对象,则不会影响函数外部的名称
foo
。因此,它们引用不同的对象。

在这种情况下,如果要更改字典,必须复制字典,并将更改保留在函数的本地


原因是,当您将字典传递到第二个
bar
函数时,Python只传递对字典的引用。因此,当您在函数内部修改它时,您正在修改存在于函数外部的同一对象。另一方面,在第一个
bar
函数中,当您编写
foo=“bar”
时,为函数内的名称
foo
指定一个不同的对象。执行此操作时,函数中的名称
foo
开始引用字符串
“bar”
,而不是字符串
“foo”
。您已更改名称所指的对象。但是函数内部的
foo
和函数外部的
foo
是不同的名称,因此如果在函数内部更改标记为
foo
的对象,则不会影响函数外部的名称
foo
。所以它们指的是不同的对象。

我想补充一点

temp_dict = CONSTdict 
没有帮助,因为这只是复制指针

相反,我需要:

temp_dict = dict(CONSTdict)
干杯


肖恩

我想补充一点

temp_dict = CONSTdict 
没有帮助,因为这只是复制指针

相反,我需要:

temp_dict = dict(CONSTdict)
干杯


肖恩很公平。我希望会有一个像const关键字这样的东西来让这个更好一点。谢谢!这是我学习C++的无耻插件。在高级语言中,这种误解有一半来自于对语言如何工作缺乏理解。如果你花时间学习一点C++,你会发现Python中的这些东西是它们的方式,因为它们要么是最快的,要么是最容易实现的。你不必知道C++如何理解Python工作,但是它使它变得更容易。@肖恩:除了Python中没有任何真正的常数(除了关键字名,如:代码>没有< /C> >,<代码>真< /COD>,<代码> false < /C> >,<代码> 1 < /COD>,<代码> 2代码>,等等,总之,<代码> const < /Cord>关键字不会帮助你,因为你的第二个<代码>正在对名为
foo
的对象执行操作,而不更改名称所指的内容<代码>常量阻止后者,但不阻止前者。蒂莫西有一个很好的观点,学习C++(或C)可能有助于使这一点更清楚。假定一个conf函数函数会在试图修改Foo内容的行上造成一个解释器错误。几乎不可能确定是否有任何特定的代码段实际修改了对象。例如,我可以创建一个对象
foo
,这样行
foo['foo']=“bar”
只将
bar
打印到控制台,而不修改
foo
。这真的很奇怪,但这是可以做到的,很公平。我希望会有一个像const关键字这样的东西来让这个更好一点。谢谢!这是我学习C++的无耻插件。在高级语言中,这种误解有一半来自于对语言如何工作缺乏理解。如果你花时间学习一点C++,你会发现Python中的这些东西是它们的方式,因为它们要么是最快的,要么是最容易实现的。你不必知道C++如何理解Python工作,但是它使它变得更容易。@肖恩:除了Python中没有任何真正的常数(除了关键字名,如:代码>没有< /C> >,<代码>真< /COD>,<代码> false < /C> >,<代码> 1 < /COD>,<代码> 2代码>,等等,总之,<代码> const < /Cord>关键字不会帮助你,因为你的第二个<代码>正在对名为
foo
的对象执行操作,而不更改名称所指的内容<代码>常量阻止后者,但不阻止前者。蒂莫西有一个很好的观点,学习C++(或C)可能有助于使这更清楚。