Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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_Global Variables_Optional Arguments - Fatal编程技术网

Python 如何更改可选函数参数的默认值

Python 如何更改可选函数参数的默认值,python,global-variables,optional-arguments,Python,Global Variables,Optional Arguments,我需要将a.py处的全局变量S从b.py更改为a.py处的函数中的默认值 a、 派克 S=“字符串” def f(s=s): 印刷品 印刷品 b、 派克 导入一个 def main(): a、 S=“另一个字符串” a、 f() 如果名称=“\uuuuu main\uuuuuuuu”: main() python b.py输出 string another string 而非预期 another string another string 如果我在b.py中这样调用a.f a.f(a.S

我需要将
a.py
处的全局变量
S
b.py
更改为
a.py
处的函数中的默认值

a、 派克

S=“字符串”
def f(s=s):
印刷品
印刷品
b、 派克

导入一个
def main():
a、 S=“另一个字符串”
a、 f()
如果名称=“\uuuuu main\uuuuuuuu”:
main()
python b.py
输出

string
another string
而非预期

another string
another string
如果我在
b.py
中这样调用
a.f

a.f(a.S)

这与预期一样有效,但有没有办法更改默认变量值?

简单的回答是:您不能

这样做的原因是函数默认参数是在函数定义时创建的,并且默认值并不意味着要重新定义。变量名绑定到一个值一次,即不能将该名称重新绑定到另一个值。首先,让我们看看全局范围内的变量:

#在全局范围内创建字符串
a=“字符串”
#b是“字符串”
b=a
a+=“new”#b仍然是“string”,a是一个新对象,因为string是不可变的
您现在刚刚将一个新名称绑定到“string”,而“string new”是绑定到a的一个全新值,它不会更改b,因为
str+=str
返回一个新的
str
,使得
a
b
引用不同的对象

函数也是如此:

x=“123”
#此表达式在定义时在此编译
def a(f=x):
印刷品(f)
x=“222”
()
# 123
变量
f
是在定义时使用默认值
“123”
定义的。这是无法改变的。即使是可变默认值,如有疑问:

x=[]
def a(f=x):
打印(x)
()
[]
#将引用更改为函数中定义的默认值
x、 附加(1)
()
[1]
x
[1]
默认参数已定义,名称
f
已绑定到值
[]
,无法更改。您可以更改与
f
关联的值,但不能将
f
绑定到新值作为默认值。进一步说明:

x=[]
def a(f=x):
f、 附加(1)
印刷品(f)
()
x
[1]
#重新定义x只是将一个新值绑定到名称x
x=[1,2,3]
#默认值仍然与您定义
#功能,尽管是可变的
()
[1, 1]
最好是A)将全局变量作为参数传递给函数,或者B)将全局变量用作
global
。如果要更改要使用的全局变量,请不要将其设置为默认参数,并选择更合适的默认值:

#一些全局值
x=“某些默认值”
#我在这里选择默认值None
#所以我可以显式地传递一些东西,或者
#对照None单例进行检查
def a(f=无):
如果f不是其他x,则f=f
印刷品(f)
()
一些违约
x=“其他默认值”
()
其他违约
a(“非默认”)
非违约

简单的回答是:你不能

这样做的原因是函数默认参数是在函数定义时创建的,并且默认值并不意味着要重新定义。变量名绑定到一个值一次,即不能将该名称重新绑定到另一个值。首先,让我们看看全局范围内的变量:

#在全局范围内创建字符串
a=“字符串”
#b是“字符串”
b=a
a+=“new”#b仍然是“string”,a是一个新对象,因为string是不可变的
您现在刚刚将一个新名称绑定到“string”,而“string new”是绑定到a的一个全新值,它不会更改b,因为
str+=str
返回一个新的
str
,使得
a
b
引用不同的对象

函数也是如此:

x=“123”
#此表达式在定义时在此编译
def a(f=x):
印刷品(f)
x=“222”
()
# 123
变量
f
是在定义时使用默认值
“123”
定义的。这是无法改变的。即使是可变默认值,如有疑问:

x=[]
def a(f=x):
打印(x)
()
[]
#将引用更改为函数中定义的默认值
x、 附加(1)
()
[1]
x
[1]
默认参数已定义,名称
f
已绑定到值
[]
,无法更改。您可以更改与
f
关联的值,但不能将
f
绑定到新值作为默认值。进一步说明:

x=[]
def a(f=x):
f、 附加(1)
印刷品(f)
()
x
[1]
#重新定义x只是将一个新值绑定到名称x
x=[1,2,3]
#默认值仍然与您定义
#功能,尽管是可变的
()
[1, 1]
最好是A)将全局变量作为参数传递给函数,或者B)将全局变量用作
global
。如果要更改要使用的全局变量,请不要将其设置为默认参数,并选择更合适的默认值:

#一些全局值
x=“某些默认值”
#我在这里选择默认值None
#所以我可以显式地传递一些东西,或者
#对照None单例进行检查
def a(f=无):
如果f不是其他x,则f=f
印刷品(f)
()
一些违约
x=“其他默认值”
()
其他违约
a(“非默认”)
非违约

这是因为默认参数是在函数定义时定义的,而不是在函数执行时定义的。这与驱动行为的机制相同,因为默认参数是在函数定义时定义的,而不是在函数执行时定义的。这与驱动行为的机制相同well@c-nivs“将这与字符串是不可变的这一事实结合起来,=>这实际上基本上是无关的-你在这里说明的是重新绑定和变异之间的区别,而不是